【问题标题】:Using Multiple CGAffineTransforms On Text Matrix在文本矩阵上使用多个 CGAffineTransforms
【发布时间】:2011-08-28 05:24:25
【问题描述】:

我正在使用 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); 为文本添加旋转。不过,我似乎无法弄清楚如何将两个仿射变换应用于文本矩阵,而不会覆盖另一个。任何帮助都会很棒。

【问题讨论】:

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


    【解决方案1】:

    您可以将矩阵与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);
    

    【讨论】:

      【解决方案2】:

      要补充@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.

      【讨论】:

      • 您正在路上,但应用变换的顺序非常重要。据此,结果显然会有所不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 2021-08-17
      相关资源
      最近更新 更多