由于处理,UITableView滚动不顺畅

时间:2011-06-30 11:53:04

标签: iphone uitableview ios4 uiimage

我正在使用UITableView在每个表格视图单元格中显示2到3个图像作为缩略图。我在tableview中展示的图像尺寸很大。如果我直接使用这些图像而没有任何尺寸缩小,那么如果我在TableView和其他视图控制器之间来回移动,则tableview可能会丢失一些图像。

所以,我想到了尺寸缩小代码,它减小了图像的大小。下面给出的代码很有效,之前的问题已修复。但是tableview失去了它的平滑滚动,因为缩小代码使用了大量内存。每次显示新的tableview单元格时,它都会处理(缩小尺寸)特定tableview单元格中的图像。

可能有一个简单的解决方案。在此先感谢。

//尺寸缩减代码

CGSize newSize=CGSizeMake(_new_width, _new_height);
UIGraphicsBeginImageContext( newSize );
[sd._image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
scene_image_preview.image =newImage;

7 个答案:

答案 0 :(得分:3)

除了缩小图像之外,您还可以将生成的newImage作为文件存储在应用的文档文件夹中。

  NSData *imageData = UIImagePNGRepresentation([UIImage imageWithCGImage:newImage]);
  CGImageRelease(newImage);
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDirectory = [paths objectAtIndex:0];
  NSString *path = [NSString stringWithFormat:@"%@/%@%d_%d.png",documentsDirectory, prefix, x, y];
  [imageData writeToFile:path atomically:NO];

答案 1 :(得分:2)

根据您拥有的图像数量,您可以将所有缩小尺寸的图像保存在NSMutableDictionary中,这是您的类的属性。

换句话说:

在标题中

@property (nonatomic, retain) NSMutableDictionary *sizedImages;

然后在你的cellForRowAtIndexPath:代码

UIImage *sizedImage = [sizedImages objectForKey:[NSNumber numberWithInt:indexPath.row]];  
//Or you could use the filename as the key

if (!sizedImage) {  
        sizedImage = [self sizeImage];(your sizing method)
        [sizedImages setObject:sizedImage forKey:[NSNumber numberWithInt:indexPath.row]];  
}

答案 2 :(得分:0)

一些可能的选择

  • 在后台执行调整大小,使其不会占用主线程。
  • 在执行此操作后缓存已调整大小的图像,因此第一次只有一个延迟(这可以与在后台执行此操作一起使用,因此滚动没有延迟)
  • 你在下载图片吗?如果是这样,请先下载缩略图并显示。然后,如果选择了图像,则将显示缩放到全屏的缩略图显示为块状,但随后在后台下载全尺寸图像并在加载时显示该图像。
  • 如果您没有下载图片,但它们已包含在应用中,只需包含缩略图并显示它们

答案 3 :(得分:0)

绘制图像通常需要时间。我认为您可以尝试通过根据需要提供帧大小来将图像放置在imageView中.i对图像的外观没有区别。

将图像视图添加到单元格并将图像添加到imageView

答案 4 :(得分:0)

这里有一个非常好的官方例子来自Apple:http://developer.apple.com/iphone/library/samplecode/LazyTableImages/index.html我认为你会在那里找到正确的方法....

答案 5 :(得分:0)

这两个链接非常有用

http://www.fieryrobot.com/blog/2008/10/01/glassy-scrolling-with-uitableview/

和他的后续帖子

http://www.fieryrobot.com/blog/2008/10/08/more-glassy-scrolling-with-uitableview/

第一个链接是一些最佳实践。第二个链接将对您更有用;将整个表视图单元格渲染为图像并使用它 - 这可以缓存到磁盘以释放内存和放大器。可以在应用程序的运行之间使用。

答案 6 :(得分:0)

- (void)saveImage:(UIImage *)image withName:(NSString *)name {

            [myArray addObject:name];

        //save image
            NSData *data = UIImageJPEGRepresentation(image, 1.0);
            NSFileManager *fileManager = [NSFileManager defaultManager];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
            NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:name];
            [fileManager createFileAtPath:fullPath contents:data attributes:nil];

    }

    - (UIImage *)loadImage:(NSString *)name {

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
            NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:name];    
            UIImage *res = [UIImage imageWithContentsOfFile:fullPath];

            return res;
    }

最后,我得到了一个同时加载大量图像数量的解决方案。首先,我使用上面的缩小代码缩小了图像的大小,并且我第一次将这些大小的图像保存到文档目录,然后使用这些saveImage和loadImage函数从文档目录中加载保存的图像。

感谢所有解决此问题的意见和建议。