1
我使用以下方法需要一些CAShapeLayers
並將它們轉換爲UIImage
。 UIImage
在單元格中用於UITableView
(非常類似於從您的某個庫中選擇照片時的照片應用程序)。這種方法是從GCD
塊中調用:在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
?
您是否使用儀器檢查幀率?另外當你說,你正在使用GCD,你是否在異步隊列上運行整個事情。我敢肯定你是。當你說口吃的時候,你能詳細說明你看到的是什麼,它是爲了進入視野中的新細胞嗎... – Srikanth
@Srikanth - 是的,圖像加載到表格中時的幀頻是35-40。但是,在我緩存了它們之後,它是60.是的,它位於異步隊列中。通過口吃我的意思是,當我滾動tableview儘可能快和滾動不光滑,它會停止和去(大概是做加載)。 –