动态设置tableview单元格行高?

时间:2016-06-17 21:45:21

标签: xcode swift uitableview uiimageview tableviewcell

我有一个带有标签和图像的tableview。在某些单元格中,没有图像,因为我使用imageView.removeFromSuperview()将其从单元格中删除。当单元格中有图像时,行高为445并且"自定义"被检查了。

如何根据标签的长度动态设置行高,而不是在删除imageview后imageview的长度/大度?

3 个答案:

答案 0 :(得分:8)

如果你想要动态行高,你可以定义你的约束(确保它们是明确的),将标签的numberOfLines设置为零,然后在viewDidLoad中,告诉它行应该自动调整他们的身高:

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 44

如果你想隐藏/显示UIImageView,我必须承认我对removeFromSuperview方法并不感到骄傲(因为当重复使用单元格时,你必须重新添加图像视图,也可能重建其约束,有几个选项:

  1. 您可以为具有图像视图的单元格设置不同的单元格原型,而为图像视图设置另一个单元格原型。然后cellForRowAtIndexPath只需要实例化正确的单元格。

  2. 您可以继续定义一组完整的约束,这些约束对于图像的存在和没有图像都是明确的。然后,您可以activate约束并根据需要将图片视图设置为hidden

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath) as! CustomCell
    
        let image = ...  // let's say it was an optional, set if needed, left `nil` if not
    
        cell.customImageView?.image = image
    
        if image == nil {
            cell.customImageView.hidden = true
            cell.imageBottomConstraint.active = false
    
            cell.customLabel.text = ...
        } else {
            cell.customImageView.hidden = false
            cell.imageBottomConstraint.active = true
        }
    
        return cell
    }
    

    具有决定单元格高度的竞争约束集合的技巧是确保它们具有不同的优先级和/或它们使用不等式,因此如果两个集合都有效,则不会产生不可满足的冲突(例如,图像视图可能具有更高的优先级)。

  3. 如果您愿意,您可以选择“旧学校”并以编程方式确定标签字段的大小,然后实施heightForRowAtIndexPath,但自动布局会使此过程变得不必要。

    < / LI>

答案 1 :(得分:1)

您需要覆盖此方法:

Override func tableview(tableview:UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {}

在此方法中返回所需indexPath所需的高度

答案 2 :(得分:1)

如果你正在使用UILabel,它有一个具有height属性的框架。

而heightForRowAtIndexPath应该涵盖您想要使用的适当方法: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/#//apple_ref/occ/intfm/UITableViewDelegate/tableView:heightForRowAtIndexPath

不确定您的图片当前是如何设置的,但这是一个粗略的例子:

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        if image != nil {
            return 445.0
        else {
            label.frame.height (or whichever value you'd prefer)
        }
}