Iphone 如何提高混合性能以实现平滑滚动? 快速介绍

Iphone 如何提高混合性能以实现平滑滚动? 快速介绍,iphone,web-services,performance,uitableview,uiimage,Iphone,Web Services,Performance,Uitableview,Uiimage,编辑:我有9个单元格。所有9个细胞都含有束图像。7捆绑图像具有某种透明度(在文件中,而不是作为代码中的混合选项),用于从其下方的web加载图像。当bundle和web图像都作为UIImage对象加载到数组中时,滚动问题会影响表视图 若我禁用web图像的绘制,那个么滚动是很漂亮的,当我禁用来自捆绑的图像时,滚动是很好的。但是,你得到了你不想要的东西:糟糕的用户体验 实施 我使用的模型是一个自定义的UITableViewCell,其中一个自定义的UIView设置为单元格的背景视图 自定义UIView

编辑:我有9个单元格。所有9个细胞都含有束图像。7捆绑图像具有某种透明度(在文件中,而不是作为代码中的混合选项),用于从其下方的web加载图像。当bundle和web图像都作为
UIImage
对象加载到数组中时,滚动问题会影响表视图

若我禁用web图像的绘制,那个么滚动是很漂亮的,当我禁用来自捆绑的图像时,滚动是很好的。但是,你得到了你不想要的东西:糟糕的用户体验

实施 我使用的模型是一个自定义的
UITableViewCell
,其中一个自定义的
UIView
设置为单元格的
背景视图

自定义
UIView
包含两个单元格大小的图像(320x80 px)。所有元素都设置为不透明且具有1.0 Alpha属性,但其中一个图像部分为100%透明

我不重用单元格,因为我无法让它们加载不同的图像。电池可一个接一个重复使用,总共可重复使用9个电池。所以我的内存中有9个可重复使用的单元。也许这就是问题所在

单元格
initWithStyle:reuseIdentifier
方法部分:

CGRect viewFrame = CGRectMake(0.0f, 0.0f, 320.0f, 80.0f);
customCellView = [[CustomCellView alloc] initWithFrame:viewFrame];
customCellView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self setBackgroundView:customCellView];
CustomCellView的初始化方法:

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        self.opaque = YES;
        self.backgroundColor = [UIColor UICustomColor];
    }
    return self;
}
使用UIImage的
imageWithData:
方法(异步下载后)将图像作为UIImage对象从PNG web定位文件(40-80kBytes)加载到NSMutableArray

正在图像加载方法中为可见单元格设置它们,并将它们从保存到UITableViewDelegate方法中的数组设置为
tableView:cellForRowAtIndexPath:
,并使用自定义方法通过UITableViewCell传递到UIView

然后在UIView的
drawRect:
overrided方法中绘制:

- (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]; }
    }
}

正如您所看到的,正在使用
drawInRect:blendMode:alpha:
方法绘制图像

问题 嗯,当在设备上滚动
UITableView
时,每次滚动期间加载新单元格时,您都会注意到(注意对用户不好,非常不好)停机

编辑:问题更多的是混合问题,在代码中,您可以看到internet图像被绘制在已在捆绑包中的图像下方-不绘制重叠图像会使滚动速度加快70%

思想 在从捆绑包加载映像时,相同的实现没有停机时间。我应该将图像保存到应用程序沙箱中,然后从那里使用它们吗。这听起来很糟糕,因为您应该最小化移动设备应用程序中的读写操作,因为每次读写时磁盘都会慢慢消亡

编辑:或者我应该将图像存储为核心图形对象


编辑:有一些线索值得商榷。但是我不知道如何有效地进行自定义绘图。

首先,您应该尝试使表格单元格可重用。这将大大提高内存使用率和响应能力

为了在tableView中从web加载图像,我使用了这个解决方案。它使用ASIHTTPRequest框架异步下载数据,并具有自定义的可重用单元

你可以按原样使用它,也可以根据自己的需要调整它。。。您可以在显示tableView之前异步下载所有图像,并将它们保存在缓存中。使用上面链接中建议的代码从缓存加载图像,而不是从web加载图像。如果你这样做的话,你可能会在一瞬间下载比用户需要的更多的数据。(如果有人使用3G,并且它的流量有限,他不会喜欢额外的流量…)

更好的解决方案是仅在需要时下载图像。您可以按原样使用代码并添加缓存模块。下载图像后,将其保存在字典中,例如,下次请求时,从字典中加载图像

每次我需要在UITableView单元格中加载图像时,最后一种方法就足够了。不需要将图像保存为核心图形对象

希望对你有帮助

编辑:
要在tableview中加载具有可重用单元格的图像,请尝试构建一个图像缓存,该缓存是一个新的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]; 

类似这样的东西可以组合两个图像。 只有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;  
}  

我也可以使用谷歌。我的内存中有这样的图像:“图像作为UIImage对象从带有UIImage的imageWithData:method(异步下载后)的PNG web定位文件加载到NSMutableArray。”。但图像有64x64像素的缩略图,存储方式与我的图像相同。第二个例子几乎相同,与问题无关。也许我不够明确。尝试解决可重用单元的问题。还有,为什么要使用uiview来显示图像,为什么不使用uiimageview?我的目的不是向你展示我知道如何使用谷歌,而你不知道。我的链接的目的是给你一个uitableview的例子,它使用