1

我使用以下方法需要一些CAShapeLayers並將它們轉換爲UIImageUIImage在單元格中用於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

+0

您是否使用儀器檢查幀率?另外當你說,你正在使用GCD,你是否在異步隊列上運行整個事情。我敢肯定你是。當你說口吃的時候,你能詳細說明你看到的是什麼,它是爲了進入視野中的新細胞嗎... – Srikanth

+0

@Srikanth - 是的,圖像加載到表格中時的幀頻是35-40。但是,在我緩存了它們之後,它是60.是的,它位於異步隊列中。通過口吃我的意思是,當我滾動tableview儘可能快和滾動不光滑,它會停止和去(大概是做加載)。 –

回答

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(); 

還有就是一個很好的例子(其中I學會了這樣做)在WWDC2012視頻「在iOS上構建併發用戶界面」