Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在iOS中高效地绘制带边框的文本_Objective C_Ios_Cocoa_Text_Border - Fatal编程技术网

Objective c 在iOS中高效地绘制带边框的文本

Objective c 在iOS中高效地绘制带边框的文本,objective-c,ios,cocoa,text,border,Objective C,Ios,Cocoa,Text,Border,我有一个自定义drawRect方法的视图,它有两条固定宽度的文本线。 随着文本的位置和内容不断变化,该视图不断以每秒16个计时器的速度重新绘制。 我还需要以在任何背景下都清晰可见的方式绘制文本,为此,我做了以下工作: CGContextSetTextDrawingMode(ctx, kCGTextStroke); // Border mode [string drawAtPoint:point withFont:font]; CGContextSetTextDrawingMode(

我有一个自定义drawRect方法的视图,它有两条固定宽度的文本线。 随着文本的位置和内容不断变化,该视图不断以每秒16个计时器的速度重新绘制。 我还需要以在任何背景下都清晰可见的方式绘制文本,为此,我做了以下工作:

CGContextSetTextDrawingMode(ctx, kCGTextStroke);        // Border mode
[string drawAtPoint:point withFont:font];
CGContextSetTextDrawingMode(ctx, kCGTextFill);          // Text mode
[string drawAtPoint:point withFont:font];
此代码以固定线宽的边框模式绘制文本,然后在相同位置以填充模式再次绘制文本。通过这种方式,我得到一个蓝色文本,每个字母周围都有白色边框

除了表现外,结果对我来说绝对令人满意。 使用时间分析器,我注意到绘制整个视图所花费的大约70%的时间都花在以边框笔划模式绘制文本上。但在填充模式下绘制仅占整个视图绘制时间的3%。考虑到视图重画的频率,我认为这是无效的

那么,有人知道如何更有效地在每个字母周围画带边框的文字吗?

两个选项:

使用阴影而不是绘制轮廓:CGContextSetShadowWithColor 使用CGLayer:CGLayerCreateWithContext缓存字符串的图像及其轮廓 说明2:

对于字母仅用一种颜色填充的标准情况,图形文本进行了高度优化。每次都不会从大纲中渲染单个glyph字母。相反,图示符只绘制一次到缓存和重用的缓冲图像中

由于很少绘制轮廓,因此可能不会缓存图示符或对该模式进行其他优化。因此,我们的想法是自己进行缓存:将整个字符串绘制到一个图像中,保留该图像并绘制它,而不是从drawRect:方法中绘制文本

有几种方法可供选择:

使用 使用 使用 两种选择:

使用阴影而不是绘制轮廓:CGContextSetShadowWithColor 使用CGLayer:CGLayerCreateWithContext缓存字符串的图像及其轮廓 说明2:

对于字母仅用一种颜色填充的标准情况,图形文本进行了高度优化。每次都不会从大纲中渲染单个glyph字母。相反,图示符只绘制一次到缓存和重用的缓冲图像中

由于很少绘制轮廓,因此可能不会缓存图示符或对该模式进行其他优化。因此,我们的想法是自己进行缓存:将整个字符串绘制到一个图像中,保留该图像并绘制它,而不是从drawRect:方法中绘制文本

有几种方法可供选择:

使用 使用 使用
谢谢你的回答。我已经用阴影实现了第一部分,它的工作速度比我在笔划模式下绘制文本时慢了两倍,我认为这是非常合乎逻辑的。但是我不太理解缓存图像的第二个选项。如果我理解正确,我可以将绘制的文本保存为图像,然后将其绘制到我的视图中,只要当前文本与缓存的文本相同。但是,由于文本的更改频率小于视图的重画频率,因此应该可以真正提高性能。非常感谢你的想法。谢谢你的回答。我已经用阴影实现了第一部分,它的工作速度比我在笔划模式下绘制文本时慢了两倍,我认为这是非常合乎逻辑的。但是我不太理解缓存图像的第二个选项。如果我理解正确,我可以将绘制的文本保存为图像,然后将其绘制到我的视图中,只要当前文本与缓存的文本相同。但是,由于文本的更改频率小于视图的重画频率,因此应该可以真正提高性能。非常感谢你的想法。