编辑:我有9个单元格。所有9个单元格都包含图像。 7个图像束具有某种透明度(文件中的,而不是代码中的混合选项),以从其下方的Web加载图像。当bundle和web图像作为UIImage
对象加载到数组中时,滚动问题会影响表视图。
如果我禁用Web图像的绘制滚动很漂亮,当我从捆绑滚动禁用图像时相当不错。但是你会得到你不想要的东西:糟糕的用户体验。
我正在使用模型,你有一个自定义 UITableViewCell
,其中一个自定义 UIView
设置为Cell {{1 }} 即可。
自定义backgroundView
包含两个单元格大小的图片( 320x80像素)。所有元素都设置为不透明并具有1.0 Alpha属性,但其中一个图像部分 100%透明。
我没有重复使用Cell,因为我没有让它们加载不同的图像。 Cell一次性重复使用,最多可重复使用9个单元。所以我在内存中有9个可重复使用的单元格。也许这就是问题所在。
单元格UIView
方法部分:
initWithStyle:reuseIdentifier
CustomCellView 的初始化方法:
CGRect viewFrame = CGRectMake(0.0f, 0.0f, 320.0f, 80.0f);
customCellView = [[CustomCellView alloc] initWithFrame:viewFrame];
customCellView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self setBackgroundView:customCellView];
使用 UIImage的 {{1方法( 异步下载后)。
在图像加载方法中将它们设置为可见单元格,并在UITableViewDelegate方法 然后用UIView的 如您所见,正在使用 好吧,当- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
self.opaque = YES;
self.backgroundColor = [UIColor UICustomColor];
}
return self;
}
中将从保存到的数组中设置为,并通过UITableViewCell通过自定义方法传递给UIView。 / p>
imageWithData:
覆盖方法绘制:tableView:cellForRowAtIndexPath:
drawRect:
方法绘制图像。问题
- (void)drawRect:(CGRect)rect {
CGRect contentRect = self.bounds;
if (!self.editing) {
CGFloat boundsX = contentRect.origin.x;
CGFloat boundsY = contentRect.origin.y;
CGPoint point;
point = CGPointMake(boundsX, boundsY);
if (firstImage) { [firstImage drawInRect:contentRect blendMode:kCGBlendModeNormal alpha:1.0f]; }
if (secondImage) { [secondImage drawInRect:contentRect blendMode:kCGBlendModeNormal alpha:1.0f]; }
}
}
在设备
编辑:问题更多的是混合问题,在代码中您看到互联网图像正在已经在捆绑中绘制 - 没有绘制重叠图像使滚动速度提高70%。
从bundle中加载图像时,相同的实现没有停机时间。我应该将图像保存到Application Sandbox,然后从那里使用它们。它听起来非常糟糕,因为您应该最小化移动设备应用程序中的读写操作,因为每次读取或写入时磁盘都会慢慢死亡。
编辑:或者我应该将图像存储为核心图形对象?
修改:this问题中有一些线索。但我不知道如何有效地进行自定义绘图。
答案 0 :(得分:1)
首先,您应该尝试让您的表格单元格可重复使用..这将对内存使用和响应能力产生重大影响..
为了在tableView中加载来自Web的图像我使用了这个link text解决方案。它使用ASIHTTPRequest框架下载数据异步,并且具有自定义可重用单元格。
您可以按原样使用它,也可以根据需要调整它...您可以在显示tableView之前将所有图像下载为异步,并将它们保存在缓存中。使用上面链接中提出的代码从缓存加载图像而不是从Web加载图像。如果你这样做,你可能会在一个时刻下载比用户需要更多的数据。(如果有人使用3G并且流量有限,他就不会喜欢额外的流量......)
更好的解决方案是仅在需要时下载图像。您可以按原样使用代码并添加缓存模块。下载图像后,将其保存在字典中,下次请求从那里加载...
每次我需要在UITableView单元格中加载图像时,最后一种方法就足够了。无需将图像保存为Core Graphics对象。
希望它有所帮助...
修改强> another solution用于在tableview中加载具有可重用单元格的图像
答案 1 :(得分:1)
来自http://iphoneincubator.com/blog/tag/uiimage
这样的东西可以组合两个图像。 只有9行,你应该没有任何延迟。
- (UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2 {
UIGraphicsBeginImageContext(image1.size);
// Draw image1
[image1 drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];
// Draw image2
[image2 drawInRect:CGRectMake(0, 0, image2.size.width, image2.size.height)];
UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resultingImage;
}
答案 2 :(得分:0)
尝试构建一个图像缓存,它是一个新的obj-c对象,它只返回你需要的UIImage,最多可以保存最近50个左右请求的UIImage。然后单元格绘制它只是询问缓存对象的图像 - 并立即获取它,或者缓存对象开始下载它。
UImage* theImage = [myImageCache imageForURL:urlForPNGImage];
[theImage drawinRect:rectForImageInCell];
// imageCache有一个UIImages字典,图像以URL作为密钥存储。您还需要跟踪上次使用时间等内容,以便控制内存。
此外,对于您使用的任何图像缓存,您需要加载用户尚未看到的行的图像。只需在所示行的两侧加载10(或其他一些数字)。然后图像准备好了。 即打电话
for (rows unseenButNearTheView)
urlForRow = blah
[myImageCache imageForURL:urlForRow];