【问题标题】:How to draw attributedString in BezierPath to an image?如何将 BezierPath 中的属性字符串绘制到图像?
【发布时间】:2014-08-05 21:42:41
【问题描述】:

我正在使用 TextKit 来获取类似于以下示例(第一张图片)的内容:将文本(attributedString)放置到使用 BezierPath 定义的区域中,该区域设置为 NSTextContainer 的 ExclusionPaths。橙色区域是排除区域,所以文字只会被绘制到蓝色区域。

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

有人知道如何实现这一目标吗?

【问题讨论】:

  • 那么,这不只是关于如何绘制图像如何生成图像吗?如果是这样,这里已经回答了很多次了。
  • @DarkDust 你是对的,如果它是像矩形这样的简单形状,很容易将文本绘制到图像中,但使用由定义的单个形状将文本绘制到图像中似乎很棘手贝塞尔路径...
  • 如果您尝试从屏幕上已有的文本创建图像,您可以考虑将视图/图层渲染为 CGImage。
  • @BrianNickel 我会看看的。

标签: ios ios7 textkit


【解决方案1】:

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

[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: 渲染单个图层,但强制重新绘制。

【讨论】:

  • 谢谢@BrianNickel 它可以工作(另外我禁用了编辑和更正以避免不需要的元素)。但与直接绘制的文本相比,质量明显不足。我已经使用UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0f); 来设置设备主屏幕的比例因子,所以据我所知,我可以通过这种方式获得最好的质量。这对我来说可能是一个很好的临时解决方案,但我希望有人可以为我最初的问题提供答案。
  • @Dirk:渲染到图像中透明背景上的文本不能使用亚像素抗锯齿,因此它看起来总是比渲染到实体表面或视图上时差一些。您可能想尝试一些CoreGraphics settings(可能希望有一个属性来在渲染成图像时打开这些变通方法)。
  • @DarkDust 我玩过 CoreGraphics 设置,但没有任何效果:o/ 不过,谢谢。
  • @Dirk 我已经用工作方法和示例项目更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
相关资源
最近更新 更多