将子视图添加到 UITableViewCell contentView 的正确方法
Posted
技术标签:
【中文标题】将子视图添加到 UITableViewCell contentView 的正确方法【英文标题】:Proper way to add subview to UITableViewCell contentView 【发布时间】:2012-10-14 20:12:45 【问题描述】:在我的应用程序中,我需要在 UITableView 中显示多个图像,所以我已经在网上搜索了很多将大图像加载到 UITableViewCells 的正确方法,更清楚的是,我将划分我的过程应用执行:
-
异步下载图片;
将它们保存到 NSHomeDirectory();
=> Thins 部分运行良好。
问题是,如何在 UITableViewCell 中显示图像,我已经尝试将 UIImageView 添加到单元格 contentView 但滚动性能有点影响,我搜索了 Apple 指南,我相信正确的方法正在将 UIImageView 添加到单元格并从 NSHomeDirectory() 加载图像,所以:
自定义 UITableViewCell 并向其添加 UIImageView(302x302px) 的最佳方法是什么?
【问题讨论】:
【参考方案1】:要获得最佳的滚动性能,必须自己绘制 UITableViewCell 的内容。 Tweetie 应用程序(现在是官方 Twitter 应用程序)的作者 Loren Brichter 就此写了一篇非常著名的博文。遗憾的是,这篇博文已被删除。 不过,This article 可能会对您有所帮助。它解释了快速滚动,有示例,还有 Loren Brichter 的演示视频。
基本上,您要做的是继承 UITableViewCell 并覆盖drawRect:
方法。要显示图像,您可以执行以下操作:
- (void)drawRect:(CGRect)rect
[myImage drawAtPoint:CGPointMake(10, 10)];
这样可以避免布局很多子视图。
【讨论】:
在最新的硬件/操作系统上仍然如此吗? 说实话,我不知道它是否仍然适用于最新的操作系统。我认为没有理由不应该这样做。我相信在覆盖-drawRect:
时,您将始终获得最佳性能。
我已经在使用drawRect,但是可以直接从drawRect下载图片,我的意思是从drawRect请求下载过程?
@MateusNunes 我不确定。我想是的。你可以看看SDWebImage 并使用他们的块。我认为这样做可以。否则,您可以从drawRect:
外部执行此操作,然后在下载图像后更新您的单元格。不过,我怀疑这是必要的。
您可以在后台线程上下载您的图像,然后将-setNeedsDisplay
发送到您的视图。当您的视图重绘时,它将有适当的图像可用。【参考方案2】:
我也有同样的问题。 我正在执行以下操作:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString* CustomCellIdentifier = @"CustomCellIdentifier";
CustomCell* cell = [tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];
if (cell == nil)
cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CustomCellIdentifier];
// add subview to cell
if (cell.customView == NULL)
cell.customView = [[CustomView alloc] initWithFrame:cell.frame];
[cell.contentView addSubview:cell.customView];
// bind cell data
return cell;
【讨论】:
【参考方案3】:首先,您需要为 UITableView 创建一个自定义单元格并继续执行以下几点。
将每行的高度设置为 302 像素
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
返回 302.0;
使用以下代码在表格的每个单元格处创建 UIImageView -(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"cell"];
const NSInteger IMAGE_VIEW_TAG=1001;
UIImageView *imageView;
if(cell==nil)
cell=[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"] autorelease];
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
imageView =[[[UIImageView alloc] initWithFrame:CGRectMake(10, 0, 302, 302)] autorelease];
imageView.tag=IMAGE_VIEW_TAG;
imageView.contentMode=UIViewContentModeScaleAspectFit;
[cell.contentView addSubview:imageView];
imageView=(UIImageView*)[cell.contentView viewWithTag:IMAGE_VIEW_TAG];
[imageView setImage:[UIImage imageNamed:@"image.png"];
return cell;
设置要显示的行数
-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return 5;
不要忘记添加 TableView 委托和数据源,UITableViewDelegate 和 UITableViewDataSource
【讨论】:
以上是关于将子视图添加到 UITableViewCell contentView 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
将子视图添加到 UITableViewCell contentView 的正确方法
如何在编辑模式下将子视图添加到 UITableViewCell 并调整其大小?
是否不可能将子视图添加到我的 UITableViewCell 的 contentView 并使其宽度与 contentView 相等?