在cellForRowAtIndexPath的uitableview中调用的函数使滚动变慢

时间:2012-05-20 23:34:56

标签: objective-c uitableview uiimage

每次用户滚动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;
}

上面的代码使滚动变慢并且不平滑。有没有办法通过更改代码来克服这个问题,以便它可以更快地加载图像?

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

你是对的,这个用于平滑滚动的make-or-break功能。你需要尽可能快地计算它。

例如,您可以为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;
}

答案 1 :(得分:0)

您可以使用静态阴影图像,还是需要为每张图像单独渲染?动态阴影是一项昂贵的操作,尤其是滚动操作。

另外,您可以在viewDidLoad中为所有图像调用此方法吗?这样,您不必渲染阴影,同时还要花费计算时间来绘制滚动视图并填充表格单元格。