drawInRect错误:CGContextSetFont:无效的上下文0x0

时间:2012-09-04 10:17:18

标签: iphone ios cocoa-touch grand-central-dispatch

我在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

错误是什么意思? 如何计算另一个帖子中的文字高度以提高速度?

谢谢。

2 个答案:

答案 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);