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

时间:2014-12-31 03:43:40

标签: ios uitableview swift

我试图在下面制作一个UITableViewCell,它将根据其内容视图调整其高度。中心的图像应与细胞框架一样宽,并按比例调整其高度。

enter image description here

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

问题:如何让细胞尊重图像的高度?

供参考:

  1. 我没有覆盖func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
  2. 我没有为UIImageView或其他任何事情设置高度限制,我只使用填充来安排视图。
  3. 使用纵横比模式显示图像。
  4. 修改

    我进一步向图片添加了高度约束:

    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来自何处,但似乎是导致冲突。有任何解决这个问题的方法吗?谢谢!

1 个答案:

答案 0 :(得分:6)

适用于iOS 7及以下版本

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

适用于iOS 8及以上版本

tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension