1

CAShapeLayers私はいくつかを取り、それらをに変換する次のメソッドを持っていますUIImage。のUIImageセルで使用されUITableViewます(ライブラリの1つから写真を選択するときの写真アプリとよく似ています)。このメソッドは、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ますか?

4

1 に答える 1

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のビデオ「Building Concurrent User Interfaces on iOS」に、この (私がその方法を学んだ) 良い例があります。

于 2012-12-25T19:19:15.553 に答える