在文本矩阵中使用多个CGAffineTransform

时间:2011-05-18 16:30:26

标签: ios objective-c text core-graphics quartz-graphics

我正在使用Quartz显示文本。这是我的代码:

    CGContextRef myContext = UIGraphicsGetCurrentContext();
    CGContextSelectFont(myContext, "Helvetica", 12, kCGEncodingMacRoman);
    CGContextSetCharacterSpacing(myContext, 8);
    CGContextSetTextDrawingMode(myContext, kCGTextFillStroke);
    CGContextSetRGBFillColor(myContext, 0, 0, 0, 1);
    CGContextSetRGBStrokeColor(myContext, 0, 0, 0, 1);
    CGContextSetTextMatrix(myContext,CGAffineTransformMake(1, 0, 0, -1, 0, 0));
    CGContextShowTextAtPoint(myContext, textOrigin.x, textOrigin.y,[way.name UTF8String],[way.name length]);

这会以正确的方向显示我的文本,但是我还需要使用CGAffineTransformMakeRotation(angle);向文本添加旋转。我似乎无法弄清楚如何将两个仿射变换应用于文本矩阵,但没有人覆盖另一个。任何帮助都会很棒。

2 个答案:

答案 0 :(得分:12)

您可以将矩阵与CGAffineTransformConcat结合使用,例如

CGAffineTransform finalTransf = CGAffineTransformConcat(t1, t2);

如果您只需要将旋转应用于现有矩阵,请使用CGAffineTransformRotate,例如

CGAffineTransform t = CGAffineTransformMake(1, 0, 0, -1, 0, 0);
CGAffineTransform t = CGAffineTransformRotate(t, M_PI/2);
CGContextSetTextMatrix(myContext, t);

答案 1 :(得分:1)

要补充@ kennytm的答案,要应用两个以上的转换,您可以执行以下操作:

var t = CGAffineTransformIdentity
t = CGAffineTransformTranslate(t, CGFloat(100), CGFloat(300))
t = CGAffineTransformRotate(t, CGFloat(M_PI_4))
t = CGAffineTransformScale(t, CGFloat(-1), CGFloat(2))
// ... add as many as you want, then apply it to to the view
imageView.transform = t

Go here to see my full answer.