如何让 UITableViewCell 调整高度以适应其内容?

Posted

技术标签:

【中文标题】如何让 UITableViewCell 调整高度以适应其内容?【英文标题】:How to make UITableViewCell adjust height to fit its content? 【发布时间】:2014-12-31 03:43:39 【问题描述】:

我正在尝试制作如下所示的UITableViewCell,它将根据其内容视图调整其高度。中间的图片应与单元格框一样宽,并按比例调整其高度。

如您所见,单元格中的图像不像我想要的那样显示。我尝试在override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 中将UIImageView 的高度设置为320.0,但根本没有帮助。

问题:如何让单元格尊重图像的高度?

仅供参考:

    我没有覆盖func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 我没有为UIImageView 或任何东西设置高度限制,我只使用填充来排列视图。 图像使用 aspect-fit 模式显示。

编辑:

我进一步为图片添加了高度限制:

class MyTableViewPostCell: UITableViewCell 
    @IBOutlet weak var contentLabel: UILabel!
    @IBOutlet weak var pictureImageView: UIImageView!
    @IBOutlet weak var pictureImageViewHeightConstraint: NSLayoutConstraint!


class MyTableViewController: UITableViewController 
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 1
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("MyTableViewPostCell") as MyTableViewPostCell
        cell.contentLabel.text = "This is a very very very very very very very long content."
        cell.pictureImageViewHeightConstraint.constant = 320
        cell.pictureImageView.sd_setImageWithURL(NSURL(string: "http://somedomain.com/pic"))
        return cell
    

运行时出现约束冲突错误。见下文:

(
    "<NSLayoutConstraint:0x7ff7b5026c30 V:[UIImageView:0x7ff7b50289e0(40)]>",
    "<NSLayoutConstraint:0x7ff7b5029a90 V:[UIImageView:0x7ff7b5029990(320)]>",
    "<NSLayoutConstraint:0x7ff7b502a630 UIImageView:0x7ff7b50289e0.top == UITableViewCellContentView:0x7ff7b5028910.topMargin + 6>",
    "<NSLayoutConstraint:0x7ff7b502a770 V:[UIImageView:0x7ff7b50289e0]-(12)-[UILabel:0x7ff7b5029390'This is a very very very ...']>",
    "<NSLayoutConstraint:0x7ff7b502a950 V:[UILabel:0x7ff7b5029390'This is a very very very ...']-(10)-[UIImageView:0x7ff7b5029990]>",
    "<NSLayoutConstraint:0x7ff7b502aa40 UITableViewCellContentView:0x7ff7b5028910.bottomMargin == UILabel:0x7ff7b5029c20'Label'.bottom + 10>",
    "<NSLayoutConstraint:0x7ff7b502aa90 V:[UIImageView:0x7ff7b5029990]-(17)-[UILabel:0x7ff7b5029c20'Label']>",
    "<NSLayoutConstraint:0x7ff7b2cae430 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7ff7b5028910(283.5)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7ff7b5029a90 V:[UIImageView:0x7ff7b5029990(320)]>

我不知道UIView-Encapsulated-Layout-Height 来自哪里,但似乎它导致了冲突。有任何解决这个问题的方法吗?谢谢!

【问题讨论】:

看到这个帖子:Using Auto Layout in UITableView for dynamic cell layouts & variable row heights 【参考方案1】:

适用于 iOS 7 及更低版本

使用AutoLayout并正确添加约束,然后使用UITableViewCellHeightForRow方法进行动态高度。

适用于 iOS 8 及更高版本

tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension

【讨论】:

以上是关于如何让 UITableViewCell 调整高度以适应其内容?的主要内容,如果未能解决你的问题,请参考以下文章

调整 UILabel 的大小以适应自定义 UITableViewCell 中的文本,无论宽度如何

UITableViewCell 动态高度

如何让 UITableView 行高自动调整为 UITableViewCell 的大小?

根据内容自动调整 UITableViewCell 高度

带有 UIWebview 的 UITableViewCell,可根据内容大小调整高度

当我尝试以编程方式添加 UIView 时,UITableViewCell 高度不会自动调整(而是压扁我的 UIView)