【问题标题】:Positioning the imageView of a UITableViewCell定位 UITableViewCell 的 imageView
【发布时间】:2011-05-11 15:53:36
【问题描述】:

在 UITableView 的每个 UITableViewCell 中,我都会在其 imageView 中放置一个图像。但是,如果我使用 tableView:heightForRowAtIndexPath: 增加单元格的高度以容纳更多文本,我发现:

  1. 图像垂直居中对齐。
  2. 图像的左边距增加。这会将文本向右推,使其左边距不再与上下单元格中的文本对齐。

我希望图像垂直上对齐,以便它位于单元格的左上角(如下图中的第一个单元格)并且其左边距不会增加(这样第二个单元格中文本的左边距与第一个单元格中的文本对齐)。

改变 imageView 的框架、中心等似乎没有影响。有任何想法吗?谢谢...

(我有这个问题的图片,但是我不让我发布图片,因为我是一个声望不到 10 的菜鸟。Grrr...)

【问题讨论】:

    标签: iphone cocoa-touch uitableview uiimageview


    【解决方案1】:

    你需要继承UITableViewCell并覆盖layoutSubviews,如下:

    - (void) layoutSubviews
    {   
        [super layoutSubviews];
    
        self.imageView.frame = CGRectMake( 10, 10, 50, 50 ); // your positioning here
    }
    

    在您的 cellForRowAtIndexPath: 方法中,请务必返回您的新单元格类型的实例。

    【讨论】:

    • 您能解释一下 Apple 文档中在哪里解释了这种方法吗?例如,为什么你不能做 imageView.frame = CGRectMake(10,10,50,50)? (这不起作用,但我不知道为什么它不起作用。似乎应该这样做)
    • 它不起作用,因为超类在其 layoutSubviews 的实现中进行布局。通过调用 [super layoutSubviews],superclas 将定位 imaveView 和任何其他标签/图标,然后您可以重新定位它们。
    • 这可能有助于理解 UITableViewCell 只是一个 UIView,它还“免费”为您管理和定位这些子视图标签和图像。您可以轻松地绘制整个单元格并做任何您想做的事情(例如围绕球弹跳)。在定制曲线的某个时刻,这正是您应该做的。 Tom 建议的那种子类化是沿着这条道路迈出的一小步。
    【解决方案2】:

    当您认为需要调整默认样式中项目的大小或位置时,您需要考虑创建一个自定义单元格,其中包含您自己的项目的大小和位置,使其按照您希望的方式进行。这就是您可以创建自定义单元格的原因。 :)

    【讨论】:

    • 对,你应该弄乱单元格的“内置”属性外观。
    • 里维拉:你应该?
    【解决方案3】:

    另一种方法(适用于 iOS 6)是创建 UIImageView 并将其作为子视图添加到单元格中

     UIImageView *yourImageView = [[UIImageView alloc] initWithFrame:CGRectMake(x,y,20,20)];
    
    [yourImageView setImage:[UIImage imageNamed:[imagesArray objectAtIndex:indexPath.row]]]; //You can have an Array with the name of 
    
    [yourcell.contentView addSubview:yourImageView]; //add the imageView as a subview
    

    【讨论】:

    • 不要直接在UITableViewCell 上添加自定义视图。相反,将它们放在contentView 对象下。这就是单元格类的设计方式。 (参见 Apple 文档)如果将视图直接放在单元格上,可能会导致意外结果。
    【解决方案4】:

    您可能没有尝试过的一个非常有用的功能(在UITableViewDelegate 中)是tableView:willDisplayCell:forRowAtIndexPath:。它在单元格显示之前立即调用,其目的是使您能够对布局进行处理,而操作系统在显示之前再次对其进行修改。实际上,您拥有完全的控制权。我用它来更改单元格中的字体,但您也可以迭代单元格的子视图并修改它们的框架。

    我仍然同意您是时候研究自定义单元格并停止与操作系统抗争了。这并不难做到,Apple 在Table View Programming Guide for iOS 中给出了一个很好的例子。

    【讨论】:

    • 我尝试这样做,但它仍然将图像重新定位在我的表格视图单元格的中间:cell.imageView.frame = CGRectMake( 10, 10, 50, 50 );。你知道为什么吗?
    【解决方案5】:

    TomSwift 解决方案的 Swift 4 变体(对我很有效):

    override public func layoutSubviews() {
            super.layoutSubviews()
            imageView?.frame = CGRect( x: 16, y: 9, width: imageView!.intrinsicContentSize.width, height:  imageView!.intrinsicContentSize.height)
        }
    

    【讨论】:

      【解决方案6】:

      您可以创建一个自定义单元格并将对象放置在您需要的位置以及设置自动掩码值。

      【讨论】:

        【解决方案7】:
        class CustomCell: UITableViewCell {
            override public func layoutSubviews() {
                super.layoutSubviews()
                imageView?.frame = CGRect( x: 20, y: 10, width: imageView!.intrinsicContentSize.width, height:  imageView!.intrinsicContentSize.height)
            }
        }
        

        在您的情节提要中使用CustomCell,使用UITableViewCell

        同样从数据源返回 CustomCell 实例

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                if let cell: CustomCell = tableView.dequeueReusableCell(withIdentifier: "revcell", for: indexPath) as? CustomCell
                {
                    //code
                    return cell
                }
                return UITableViewCell()
            } 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-06
          • 1970-01-01
          • 2011-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多