将子视图添加到 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

如何将子视图添加到 UITableViewCell

将子视图添加到 UITableViewCell 问题

将子视图添加到 UITableViewCell contentView 的正确方法

如何在编辑模式下将子视图添加到 UITableViewCell 并调整其大小?

是否不可能将子视图添加到我的 UITableViewCell 的 contentView 并使其宽度与 contentView 相等?