0

我正在努力完成的事情

我有一个 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 团队。

4

1 回答 1

-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);
});
于 2012-10-30T07:50:57.367 回答