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来存储处理后的图像;以索引路径为key,避免在滚动过程中多次请求同一张图片时重新计算。

-(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 回答