我在drawRect:
中向UIVIew画了一些文字。首先,我计算文本高度,然后计算drawInRect:
。代码如下:
- (void)drawRect:(CGRect)rect
{
CGFloat titleHeight = [self heightForText:_entry.title
withFont:[UIFont systemFontOfSize:12.0f]];
CGRect r = CGRectMake(54, 6, kCellTextWidth, titleHeight);
[_entry.title drawInRect:r withFont:[UIFont titleFont]];
}
然后我用dispatch_async
和main_queue中的drawInRect计算文本高度,它失败了:
- (void)drawRect:(CGRect)rect
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
CGFloat titleHeight = [self heightForText:_entry.title
withFont:[UIFont systemFontOfSize:12.0f]];
dispatch_async(dispatch_get_main_queue(), ^{
CGRect r = CGRectMake(54, 6, kCellTextWidth, titleHeight);
[_entry.title drawInRect:r withFont:[UIFont titleFont]];
});
});
}
错误:
<Error>: CGContextSetFont: invalid context 0x0
<Error>: CGContextSetTextMatrix: invalid context 0x0
<Error>: CGContextSetFontSize: invalid context 0x0
<Error>: CGContextSetTextPosition: invalid context 0x0
<Error>: CGContextShowGlyphsWithAdvances: invalid context 0x0
错误是什么意思? 如何计算另一个帖子中的文字高度以提高速度?
谢谢。
答案 0 :(得分:3)
您可以使用辅助线程中的CoreGraphics和CoreText API。
只有极少数UIKit API可以安全地从辅助线程调用。作为一般规则,UIKit API仅适用于主线程。
错误意味着NULL
上下文正在传递给CG-API。辅助线程默认情况下不创建一个 - 您必须创建自己的渲染上下文和目标以在辅助线程上呈现。 UIKit调用只是抓取线程上下文堆栈中的顶层上下文 - 在辅助线程上或在此上下文中不存在上下文堆栈。
就速度而言 - 很难相信一个标签会导致如此明显的减速。也许更多的背景会有所帮助。
答案 1 :(得分:1)
我有类似的问题,并使用UIGraphicsPushContext(context)/UIGraphicsPopContext(context)
围绕绘图代码解决了这个问题。上下文是用
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 0, space, kCGImageAlphaPremultipliedLast);