Objective c 使单元格大小的图像平滑滚动的UITableView 这里写的所有东西实际上都是正确的
方法用法除外Objective c 使单元格大小的图像平滑滚动的UITableView 这里写的所有东西实际上都是正确的,objective-c,uitableview,graphics,opengl-es,uiimage,Objective C,Uitableview,Graphics,Opengl Es,Uiimage,方法用法除外 实施 我使用的模型是一个自定义的UITableViewCell,其中一个自定义的UIView设置为单元格的背景视图 自定义UIView包含两个单元格大小的图像(320x80 px),其中一个对视图的一半是100%透明的。所有元素都设置为不透明,并具有1.0α属性 我不重用单元格,因为我无法让它们加载不同的图像。电池可一个接一个重复使用,总共可重复使用9个电池。因此,我的内存中有9个可重复使用的单元。 单元格initWithStyle:reuseIdentifier方法部分:
实施 我使用的模型是一个自定义的
UITableViewCell
,其中一个自定义的UIView
设置为单元格的背景视图
自定义UIView
包含两个单元格大小的图像(320x80 px),其中一个对视图的一半是100%透明的。所有元素都设置为不透明,并具有1.0α属性
我不重用单元格,因为我无法让它们加载不同的图像。电池可一个接一个重复使用,总共可重复使用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的ImageName:
方法将图像作为UIImage对象从PNG文件预加载到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:
方法绘制图像
问题
UtableView根本无法滚动,它在每个单元格上都会被点击,它又粗又令人毛骨悚然
思想
深入挖掘示例代码、stackoverflow和论坛让我想到了使用OpenGL ES预渲染图像,但实际上,平滑滚动有那么难吗?仅使用UIImageView有什么问题?他们还不够快吗?(如果您正在预加载UIImages,它们应该是)
需要注意的一点是,[UIImage ImageName:]不会显式地将图像数据加载到内存中。它将为您提供一个由磁盘上的数据支持的引用。您可以通过拨打[yourImage CGImage]来解决此问题。仅使用UIImageView有什么问题?他们还不够快吗?(如果您正在预加载UIImages,它们应该是)
需要注意的一点是,[UIImage ImageName:]不会显式地将图像数据加载到内存中。它将为您提供一个由磁盘上的数据支持的引用。你可以通过打电话给[yourImage CGImage]来解决这个问题。这里没有明显的错误,但我同意这种方法不应该太慢。你不需要德国劳埃德船级社来做这件事。你是如何加载图像的?绘制图像时是否缩放图像(例如,图像是否本机大于最终大小)?否,图像是单元格的精确大小。如果我在drawRect:方法中禁用图像绘制,则单元格平滑且性感。他们肯定出了问题。试着运行shark,或者仪器中的新时间分析器。这将告诉你哪些方法占用的时间最多。这里没有明显的错误,但我同意这种方法不应该慢得令人痛苦。你不需要德国劳埃德船级社来做这件事。你是如何加载图像的?绘制图像时是否缩放图像(例如,图像是否本机大于最终大小)?否,图像是单元格的精确大小。如果我在drawRect:方法中禁用图像绘制,则单元格平滑且性感。他们肯定出了问题。试着运行shark,或者仪器中的新时间分析器。这将告诉您哪些方法占用的时间最多。