我有一个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团队。
答案 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);
});