如何在iOS中以简单的单行方式呈现字体?

时间:2016-07-10 07:45:56

标签: ios opengl-es

我想在iOS中将文本渲染为纹理,所以我可以使用OpenGL绘制它。我正在使用此代码:

CGSize textSize = [m_string sizeWithAttributes: m_attribs];
CGSize frameSize = CGSizeMake(NextPowerOf2((NSInteger)(MAX(textSize.width, textSize.height))), NextPowerOf2((NSInteger)textSize.height));

UIGraphicsBeginImageContextWithOptions(frameSize, NO /*opaque*/ , 1.0 /*scale*/);

CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSetTextDrawingMode(currentContext, kCGTextFillStroke);

CGContextSetLineWidth(currentContext, 1);
[m_string drawAtPoint:CGPointMake (0, 0) withAttributes:m_attribs];

当我尝试使用kCGTextFillStroke或kCGTextStroke时,我得到了这个:
enter image description here

当我尝试使用kCGTextFill时,我得到了这个:
enter image description here

有没有办法简单,一行干净的文字像这样? (取自OS X上的渲染)
enter image description here

2 个答案:

答案 0 :(得分:1)

这看起来像解决问题但无论如何......

您正在使用iOS我建议您使用UI组件UILabel。然后将所有参数设置为您想要的标签,包括换行模式,行数,属性文本,字体......您可以调用sizeToFit以获得标签的最小可能尺寸。您不会将标签添加到任何其他视图,而是从视图中创建UIImage(您在SO上有相当多的答案)。获得图像后,您可以简单地将原始RGBA数据复制到纹理(再次加载有关如何从UIImage获取RGBA数据的答案)。就是这样。那么你可能想要检查视网膜x2和x3设备的内容比例,或者通过相应的因素增加字体大小来手动完成。

这个程序可能看起来像是一种解决方法,可能比使用核心图形要慢得多,但事实却远非如此:

  • 使用大小和选项创建上下文会创建与CGImage相同的RGBA缓冲区(UIImage仅包装它)
  • 核心图形用于将视图绘制到UIImage,因此操作过程基本相同。
  • 您仍然需要将数据复制到纹理,但这两种情况都是如此。这里的一个小缺点可能是,为了从图像中访问RGBA原始数据,您需要在线下某处复制(复制)原始数据,但这是一个相对快速的操作,并且很可能在您的过程中发生相同的情况。 / LI>

因此,这个程序可能会消耗更多的资源(实际上并不多,甚至可能更少)但是在绘制文本时你会获得无限的权力。

答案 1 :(得分:0)

好吧,最终我渲染到了一个大小加倍的纹理并将其转换为UIImage,其比例为2.通过利用视网膜显示。

    UIImage* pTheImage = UIGraphicsGetImageFromCurrentImageContext();
    UIImage* pScaledImage = [UIImage imageWithCGImage:pTheImage.CGImage scale:2 orientation:pTheImage.imageOrientation];

我只是将它用作openGL绘图的纹理。