1

ユーザーがuitableviewをスクロールするたびに返される画像があります。このコードは内部にあります:

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

呼び出されているコードは次のとおりで、指定された画像の影を作成します。

-(UIImage*)imageWithShadowForImageRight:(UIImage *)initialImage {

    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef shadowContext = CGBitmapContextCreate(NULL, initialImage.size.width + 10, initialImage.size.height + 10, CGImageGetBitsPerComponent(initialImage.CGImage), 0, colourSpace, kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(colourSpace);

    CGContextSetShadowWithColor(shadowContext, CGSizeMake(5,-5), 10, [UIColor blackColor].CGColor);
    CGContextDrawImage(shadowContext, CGRectMake(0, 10, initialImage.size.width, initialImage.size.height), initialImage.CGImage);

    CGImageRef shadowedCGImage = CGBitmapContextCreateImage(shadowContext);
    CGContextRelease(shadowContext);

    UIImage * shadowedImage = [UIImage imageWithCGImage:shadowedCGImage];
    CGImageRelease(shadowedCGImage);

    return shadowedImage;
}

上記のコードは、スクロールを遅くし、スムーズではありません。コードを変更して画像をより速くロードできるようにすることで、この問題を解決する方法はありますか?

助けていただければ幸いです。

4

2 に答える 2

1

そうです、これスムーズなスクロールのためのメイクまたはブレーク機能です。できるだけ多くの計算を避けて、できるだけ速くする必要があります。

たとえば、メソッドで処理された画像のキャッシュを追加できます。処理された画像を保存imageWithShadowForImageRight:するインスタンスを設定します。NSCacheインデックスパスでキーを設定し、スクロールプロセス中に同じ画像が複数回要求された場合の再計算を回避します。

-(UIImage*)imageWithShadowForImageRight:(UIImage *)initialImage atIndexPath:(NSIndexPath*) indexPath {
    UIImage *res = [cache objectForKey:indexPath];
    if (!res) {
        // get the shadowed image
        res = shadowedImage;
        [cache setObject:res forKey:indexPath];
    }
    return res;
}
于 2012-05-20T23:42:37.137 に答える
0

静的なシャドウイメージを使用できますか、それともイメージごとに個別にレンダリングする必要がありますか?動的シャドウは、特にスクロールと組み合わせると、コストのかかる操作です。

また、viewDidLoad内のすべての画像に対してこのメ​​ソッドを呼び出すことはできますか?そうすれば、スクロールビューの描画とテーブルセルへの入力に計算時間を費やしながら、シャドウをレンダリングする必要がなくなります。

于 2012-05-20T23:41:41.030 に答える