如何将BezierPath中的attributionString绘制到图像?

时间:2014-08-05 21:42:41

标签: ios ios7 textkit

我正在使用TextKit来获得类似下面的示例(第一个图像):文本(attributedString)放置在使用BezierPath定义的区域中,设置为ExclusionPaths到NSTextContainer。橙色区域是排除区域,因此文本将仅绘制到蓝色区域。

displayed text

到目前为止一切顺利。 我的问题是,如何将文字绘制成图像? 所以我的图像只有透明背景和文字,如下所示:

transparent image with text only

有谁知道如何实现这个目标?

1 个答案:

答案 0 :(得分:2)

看起来您正在尝试实现一个编辑器,用户可以在其中输入文本然后生成最终图像。如果是这种情况,您可以通过查找带有文本的图层并将其绘制到当前上下文中,将文本视图直接绘制到图形上下文中:

[layerWithText drawInContext:UIGraphicsGetCurrentContext()];

通过实验,我在iOS8上发现了layerWithText == textView.layer.sublayers[0]。既然你在私人空间,你不能保证iOS版本之间的配置。稍微好一点的版本如下,但它假设图层和所有子图层处于相同位置而没有变换。我的建议是观察新版本出现时没有任何问题。

- (void)drawLayer:(CALayer *)layer recursivelyInContext:(CGContextRef)context
{
    [layer drawInContext:context];
    for (CALayer *sublayer in layer.sublayers) {
        [self drawLayer:sublayer recursivelyInContext:context];
    }
}

如果不透明,这将捕获文本视图的背景,因此如果是这种情况,您可能需要执行以下操作:

UIColor *originalBackgroundColor = textView.backgroundColor;
textView.backgroundColor = [UIColor clearColor];
[self renderLayer:textView.layer recursivelyInContext:UIGraphicsGetCurrentContext()];
textView.backgroundColor = originalBackgroundColor;

示例项目: https://github.com/bnickel/SO25148857

注意:我最初建议使用renderInContext:,因为这会渲染视图的图层和所有子图层。遗憾的是,这似乎呈现了层次结构的缓存光栅化。相比之下,drawInContext:会渲染单个图层但会强制进行全新绘制。