在后台线程ios中绘制文本

时间:2012-10-30 07:34:14

标签: iphone objective-c ios core-graphics grand-central-dispatch

我正在努力完成的事情

我有一个UICollectionView,我正在尝试渲染背景中的所有绘图,然后在完成淡入淡出动画时显示。

我已经很好地使用了图像,但有些图形只是文本。我需要适当调整文本的大小,然后在后台绘制它。

这可能是很多文本,并且在主线程上完成时会产生口吃。

我是怎么做的

我正在使用CGBitmapContextCreate用于图片,所以我也尝试用文字做到这一点:

-(void)drawTextFromBundle
{
     UIFont * font = [UIFont AvenirLTStdBlackObliqueWithSize:35]; //custom font

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
         CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
         CGContextRef context = CGBitmapContextCreate(NULL, 250, backgroundHeight - 112, 8, 250 * 4, colorSpaceRef, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little);
         CGColorSpaceRelease(colorSpaceRef);
         [_text drawInRect:CGRectMake(0, 0, 250, backgroundHeight - 112) withFont:font];
          CGImageRef outputImage = CGBitmapContextCreateImage(context);
          imageRef = outputImage;
         [self performSelectorOnMainThread:@selector(finishDrawingImage) withObject:nil waitUntilDone:YES];
         CGContextRelease(context);
         CGImageRelease(outputImage);
   });
}

详细

这显然不是一种正确的方法,因为我收到很多错误,都涉及Core Graphics文本函数,类似于<Error>: CGContextSetFont: invalid context 0x0

我知道有UIGraphicsGetCurrentContext但我不确定这是否是线程安全的,因为我听说不是。

要注意,此方法确实是从-drawRect:方法中调用的。相同的确切上下文参数适用于我的图像。

我可以做些什么来将文字绘制到我想要的任何自定义中,所有这些都在后台安全地完成?如果您可以在缩小文本以适合合适的大小的同时告诉我如何操作,可以获得奖励积分。

再次感谢SO团队。

1 个答案:

答案 0 :(得分:-1)

当您更改UI时,您需要在主线程(主队列)中。

尝试将以下内容放入主队列

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL, 250, backgroundHeight - 112, 8, 250 * 4, colorSpaceRef, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little);
    CGColorSpaceRelease(colorSpaceRef);

    dispatch_async(dispatch_get_main_queue(), ^{
        [_text drawInRect:CGRectMake(0, 0, 250, backgroundHeight - 112) withFont:font];
        CGImageRef outputImage = CGBitmapContextCreateImage(context);
        imageRef = outputImage;
        [self performSelectorOnMainThread:@selector(finishDrawingImage) withObject:nil waitUntilDone:YES];
    });

    CGContextRelease(context);
    CGImageRelease(outputImage);
});