我有以下方法,它需要一些CAShapeLayers
并将它们转换为UIImage
。 UIImage
在单元格中用于UITableView
(非常类似于从您的某个库中选择照片时的照片应用)。从GCD
块中调用此方法:
-(UIImage*) imageAtIndex:(NSUInteger)index
{
Graphic *graphic = [[Graphic graphicWithType:index]retain];
CALayer *layer = [[CALayer alloc] init];
layer.bounds = CGRectMake(0,0, graphic.size.width, graphic.size.height);
layer.shouldRasterize = YES;
layer.anchorPoint = CGPointZero;
layer.position = CGPointMake(0, 0);
for (int i = 0; i < [graphic.shapeLayers count]; i++)
{
[layer addSublayer:[graphic.shapeLayers objectAtIndex:i]];
}
CGFloat largestDimension = MAX(graphic.size.width, graphic.size.height);
CGFloat maxDimension = self.thumbnailDimension;
CGFloat multiplicationFactor = maxDimension / largestDimension;
CGSize graphicThumbnailSize = CGSizeMake(multiplicationFactor * graphic.size.width, multiplicationFactor * graphic.size.height);
layer.sublayerTransform = CATransform3DScale(layer.sublayerTransform, graphicThumbnailSize.width / graphic.size.width, graphicThumbnailSize.height / graphic.size.height, 1);
layer.bounds = CGRectMake(0,0, graphicThumbnailSize.width, graphicThumbnailSize.height);
UIGraphicsBeginImageContextWithOptions(layer.bounds.size, NO, 0);
[layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = [UIGraphicsGetImageFromCurrentImageContext() retain];
UIGraphicsEndImageContext();
[layer release];
[graphic release];
return [image autorelease];
}
无论出于何种原因,当我滚动UITableView
并加载图片时,它会有点卡顿。我知道GCD
代码很好,因为它以前工作过,所以看起来这段代码中的某些东西导致了口吃。有谁知道那可能是什么? CAAnimation
不是线程安全的吗?或者有没有人知道采取一堆CAShapeLayers
并将其转换为UIImage
的更好方法?
答案 0 :(得分:1)
最后我相信:
[layer renderInContext:UIGraphicsGetCurrentContext()];
无法在单独的线程上完成,因此我必须执行以下操作:
UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
//draw the mutable paths of the CAShapeLayers to the context
UIImage *image = [UIGraphicsGetImageFromCurrentImageContext() retain];
UIGraphicsEndImageContext();
在WWDC2012视频“在iOS上构建并发用户界面”中有一个很好的例子(我学会了这样做)