动态高度UITableViewCell

时间:2016-04-06 18:41:03

标签: ios swift uitableview

我的单元格包含标题,日期和一些标签。

这是故事板的截图:

Custom cell in storyboard

我在ViewDidLoad中设置了以下内容:

tableView.rowHeight = UITableViewAutomaticDimension

但是没有给出tableView的任何估计值,我将解释原因。

这是我的customCell:

@IBOutlet weak var title: UILabel!
@IBOutlet weak var date: UILabel!
@IBOutlet weak var hashtagsView: UIView!

var item: Item? {
    didSet {
        configureCell()
    }
}

func configureCell() {
    if item = item {
        title.text = item!.title
        date.text = item!.date

//      The part where I calculate the sizes of hashtags to fit them in hashtagsView

        let totalWidth = CGRectGetWidth(hashtagsView.frame)
        print("TotalWidth: \(totalWidth)")
        .
        .
        .
        .
        print("Content: \(self.contentView.frame)")
        print("HashtagsView: \(self.hashtagsView.frame)")
    }
}

<小时/> 结果如下:

使用tableView.estimatedHeight = 150

TotalWidth: 240.0
Content: (0.0, 0.0, 240.0, 119.666666666667)
HashtagsView: (0.0, 0.0, 240.0, 128.0)

<小时/> 没有估计高度

TotalWidth: 240.0
Content: (0.0, 0.0, 414.0, 43.6666666666667)
HashtagsView: (0.0, 0.0, 240.0, 128.0)

<小时/> 小结

当有一个估计的高度时,单元格的内容视图不会打印正确的宽度,但显示单元格的内容就像没有错误(除了hashtagsView)。< / p>

当没有估计高度时,单元格的contentView确实会打印正确的宽度,这样我就可以计算出标签帧,但单元格会以默认的44高度显示。

<小时/> 详细信息

由于我不知道有多少个标签,我试图使用空白的UIView以编程方式添加UIButtons。并且为了计算目的,主题标签&#39;按钮,我需要有&#34;宽度&#34;单元格的contentView或hashtagsView,但是当我设置tableView.estimatedHeight时,单元格的宽度将是一些任意数字(例如,在6s Plus Simulator中为240)。即使我没有自动布局问题,我也无法获得hashtagsView的宽度。

当我没有给tableView.estimatedHeight估算时,我得到以下内容:

Custom cells without estimatedHeight

<小时/> 更新 - @EarlGray在评论中提出的更新

主题标签实际上是UIButtons我将它们动态地添加到hashtagsView中。我需要延长hashtagsView的高度,以便它能够容纳多行标签。

我认为我需要继承UIView并覆盖layoutSubviews()以实现适合的垂直布局或以编程方式为每个子视图(UIButtons)添加约束。

做@VinodVishwanath所说的,设置estimatedRowHeight结合明确的高度和垂直空间限制给了我这个:

无法让我获得hashtagsView的宽度。在计算UIBUttons&#39;帧,我需要cell.contentView的宽度,但不知何故,设置estimatedRowHeight给我以下的cell.contentView.frame坐标

 Content: (0.0, 0.0, 240.0, 119.666666666667)

这是不正确的,因为它必须给出414,这就是我的主题标签从屏幕的一半开始的原因。

注释掉tableView.estimatedRowHeight会给我正确的坐标:

Content: (0.0, 0.0, 414.0, 43.6666666666667)

但是像我这样混淆了我的tableView:

<小时/> 更新#2 - 这是我对cell.contentView的约束

ContentView's constraints

<小时/> 更新#3 - 我的configureCell方法的断点

HashtagsView's superview returns nil!!

我没有得到它,我的UIView IBOutlet已连接,我再次检查。

所有contentView.subviews都有错误的框架。 superview-less hashtagsView也是如此。

但是当我删除estimatedRowHeight时,它突然将hashtagsView视为cell的contentView的子视图。除了contentView,它的子视图框架&#39;仍然返回错误和负值。

1 个答案:

答案 0 :(得分:0)

如果您未提供估计的行高,则单元格高度默认为44,这就是您获得43.667内容高度的原因。

您需要提供估计的行高,这将是提供的字段中没有标记时的高度。然后,动态设置正确高度所需的所有内容都是正确的自动布局约束集,以提供contentView的内在大小。

当您在contentView的所有子视图之间设置垂直空间约束时,会发生这种情况,包括topSpaceToSuperviewbottomSpaceToSuperview,以使AutoLayout引擎能够计算内在内容大小。< / p>

修改

我已经从截图中分析了您的约束,以下是您为计算单元格高度而添加的相关约束:

  • Title.top = topMargin + 8
  • bottomMargin =分享Button.bottom
  • Link.centerY =分享Button.centerY
  • Hashtags View.top = Title.bottom
  • Date.top = Hashtags View.bottom + 15

现在,这里是这些约束的直观表示:

TOPMARGIN

|

标题

|

Hashtags View

|

日期

!!! 断开链接 !!!

链接 - 分享按钮

|

BottomMargin

断开的链接会阻止布局引擎计算单元格高度。您需要在垂直布局中修复损坏的链接,例如,设置Date.centerY = shareButton.centerY或设置Date.top = HashtagsView.bottom