我正在使用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;
答案 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函数从文档目录中加载保存的图像。
感谢所有解决此问题的意见和建议。