如何正确补偿CGContextRef坐标系,因此原点位于左上角

时间:2019-04-22 18:16:09

标签: ios objective-c nsattributedstring core-text

我正在尝试使用CoreText绘制文本。我有以下代码:

CGContextRef uiContext = UIGraphicsGetCurrentContext();

NSMutableDictionary<NSAttributedStringKey,id> *attributes = [NSMutableDictionary<NSAttributedStringKey,id> new];
[attributes setObject:UIColor.redColor forKey:NSForegroundColorAttributeName];
[attributes setObject:[UIFont systemFontOfSize:40] forKey:NSFontAttributeName];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:@"Str" attributes:attributes];

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, nil, CGRectMake(0, 50, attrString.size.width, attrString.size.height));
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attrString);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, attrString.length), path, nil);

CTFrameDraw(frame, uiContext);

使用上面的代码,文本已正确放置,但在y方向proper origin, wrong text orientation上进行了镜像

因此,我尝试应用翻译和缩放转换,这对文本有帮助,但是现在它位于左下角,这不是您想要的行为。

CGContextSetTextMatrix(uiContext, CGAffineTransformIdentity);
CGContextTranslateCTM(uiContext, 0.0, self.bounds.size.height);
CGContextScaleCTM(uiContext, 1.0, -1.0);

wrong origin, proper orientation

这里有什么想法吗?谢谢。

2 个答案:

答案 0 :(得分:1)

y原点的这50个值从哪里来?

CGPathAddRect(path, nil, CGRectMake(0, 50, attrString.size.width, attrString.size.height));

如果您从y坐标的左下角开始,则该50值将从该坐标开始以y原点50为起点。

通过使用容器视图的高度(要将文本绘制到其中)减去attrString.size.height,您应该能够将y原点调整为从顶部偏移。

下面是一个示例,该示例显示了绘制自定义视图的子类'drawRect:rect的情况:

CGPathAddRect(path, nil, CGRectMake(0, rect.size.height - attrString.size.height, attrString.size.width, attrString.size.height));

这将导致以下结果:

CoreTextDrawing upper left hand corner of container view

答案 1 :(得分:0)

这个怎么样?

迅速:

   CGContextSetTextMatrix(uiContext, CGAffineTransform(a: 1.0, b: 0.0, c: 0.0, d: -1.0, tx: 0.0, ty: 0.0))

目标c:

    CGContextSetTextMatrix(uiContext, CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0));

要进行简单设置,请执行以下操作:

   CGPathAddRect(path,nil, CGRectMake(0, 0, attrString.size.width, 1.5 * attrString.size.height));

代替:

     CGPathAddRect(path, nil, CGRectMake(0, 50, attrString.size.width, attrString.size.height));