绘制矩形出错:CGContextSetFont: 无效上下文0x0。

3

我在drawRect:中绘制了一些文本。首先计算文本高度,然后使用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计算文本高度并在主队列中使用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

这个错误是什么意思?如何在另一个线程中计算文本高度以提高速度?

谢谢。


由于dispatch_async块不允许对UI进行更改,请注意。 - Paresh Navadiya
2个回答

3

您可以从辅助线程使用CoreGraphics和CoreText API。

只有极少数UIKit API可以安全地从辅助线程调用。通常,UIKit API仅适用于主线程。

错误意味着CG-API正在传递NULL上下文。辅助线程默认情况下不会创建上下文 - 您必须创建自己的渲染上下文和目标以在辅助线程上进行渲染。 UIKit调用只会抓取线程上下文堆栈中的顶部上下文 - 上下文堆栈不存在于辅助线程或此上下文中。

就速度而言 - 很难相信一个标签会导致如此明显的减速。也许更多的上下文会有所帮助。


感谢您的回答。这个单元格上还有其他标签和子视图,我只是为了举例放了一个。您说得对,从辅助线程调用drawInRect:是不安全的,感谢您的帮助。 - fannheyward

1

我曾遇到类似的问题,通过在绘制代码周围使用 UIGraphicsPushContext(context)/UIGraphicsPopContext(context) 解决了它。context 是使用创建的。

CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 0, space, kCGImageAlphaPremultipliedLast);

你能再详细解释一下吗?我不确定这里发生了什么。 - p0lAris
我只是按照所述的方式创建了一个上下文并将其推送到图形上下文堆栈上,在任何绘图之前。 - Vlad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接