我正在使用TextKit来获得类似下面的示例(第一个图像):文本(attributedString)放置在使用BezierPath定义的区域中,设置为ExclusionPaths到NSTextContainer。橙色区域是排除区域,因此文本将仅绘制到蓝色区域。
到目前为止一切顺利。 我的问题是,如何将文字绘制成图像? 所以我的图像只有透明背景和文字,如下所示:
有谁知道如何实现这个目标?
答案 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:
会渲染单个图层但会强制进行全新绘制。