3

我在 UIVIew 中绘制了一些文本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然后我用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

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

谢谢你。

4

2 回答 2

3

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

只有很少的 UIKit API 可以安全地从辅助线程调用。作为一般规则,UIKit API 仅适用于主线程。

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

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

于 2012-09-04T10:21:45.767 回答
1

我有类似的问题,并用UIGraphicsPushContext(context)/UIGraphicsPopContext(context)绘图代码解决了它。上下文是用

CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 0, space, kCGImageAlphaPremultipliedLast);
于 2013-03-27T08:41:48.737 回答