iOS + Swift 2:UITableViewCell 中的动态高度不适用于空视图

Posted

技术标签:

【中文标题】iOS + Swift 2:UITableViewCell 中的动态高度不适用于空视图【英文标题】:iOS + Swift 2: Dynamic height in UITableViewCell doesn't work with an empty view 【发布时间】:2016-06-28 23:51:45 【问题描述】:

这是我的问题。我在 UITableView 中使用自定义 UITableViewCell 作为标识符为“cellidentifier”的 Cell 原型。在这个 UITableViewCell 中,我添加了(在 Interface Builder 中)一个空的 UIView 到 contentView 的单元格中,我称之为“bubbleView”,它有一个连接 @IBOutlet,我添加了约束 top = 0、bottom = 0、leading = 0 和 trailing = 0。

在控制器(继承自 UITableViewDataSource 和 UITableViewDelegate)中,在 viewDidLoad 函数中我添加了以下几行:

override func viewDidLoad() 
   ...
   self.mytable.delegate = self
   self.mytable.dataSource = self
   self.mytable.estimatedRowHeight = 100.0
   self.mytable.rowHeight = UITableViewAutomaticDimension;
   ...

然后,我以这种方式实现了 UITableViewDelegate 的方法:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    var cell = tableView.dequeueReusableCellWithIdentifier("cellidentifier") as! myCustomCell!
    if (cell == nil) 
        cell = myCustomCell(style:UITableViewCellStyle.Subtitle, reuseIdentifier:"cellidentifier")
    
    let myNewView = UIView(frame: CGRectMake(0, 10, randomWidth, random Height))
    cell.bubbleView.addSubview(myNewView)
    return cell


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return items.count   


func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    return 1

使用该代码,我可以将 myNewView 添加到单元格中,但单元格不会根据 myNewView 高度调整到实际高度,例如,如果 myNewView 高度为 134,我的自定义视图单元格总是返回 44 高度。正如一些教程所说,我添加了 layoutIfNeeded 属性,但它不起作用。有人有这个解决方案吗?

【问题讨论】:

【参考方案1】:

您的空视图是否有高度限制?如果您只是将气泡视图固定到超级视图的边缘,我认为这不足以让自动布局确定单元格的高度。

此外,对于您的原型单元,请转到尺寸检查器。您的 Table View Cell 是如何在那里配置的?将其配置为“默认”与“自定义”可能会也可能不会解决问题。

如果您希望单元格真正自动调整大小,您肯定需要提供足够的约束,以便实际计算高度。

【讨论】:

【参考方案2】:

解决方案:这是一个关于约束的主题。如果您在 Interface Builder 中注意到,您需要非常清楚约束,因此分配顶部、底部、前导和尾随对于空视图来说是模棱两可的。然后,解决方案是根据您的需要向 myNewView 添加约束(在我的情况下是顶部、宽度和高度)并设置高度约束以参考 myNewView 来查看容器(cell.bubbleView):

//Create my view
let myNewView = UIView(frame: CGRectMake(0, 10, randomWidth, random Height))

myNewView.translatesAutoresizingMaskIntoConstraints = true

//Assign top constraint according with container (cell.bubbleView)
let pinTop = NSLayoutConstraint(item: myNewView, attribute: .Top, relatedBy: .Equal, toItem: cell.bubbleView, attribute: .Top, multiplier: 1.0, constant: 10)
cell.bubbleView.addConstraint(pinTop)

//set width constraint of myNewView
let pinWidth = NSLayoutConstraint(item: myNewView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: myNewView.frame.size.width)
cell.bubbleView.addConstraint(pinWidth)

//set height constraint of myNewView
let pinHeight = NSLayoutConstraint(item: myNewView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: myNewView.frame.size.height)
cell.bubbleView.addConstraint(pinHeight)

//set height constraint of container according the myNewView plus top and bottom space
let pinHeightView = NSLayoutConstraint(item: cell.bubbleView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: myNewView.frame.size.height+20)
cell.bubbleView.addConstraint(pinHeightView)

cell.bubbleView.addSubview(myNewView)

最后不要忘记配置 UITableView 以动态生成高度单元格。

self.mytable.estimatedRowHeight = 100.0
self.mytable.rowHeight = UITableViewAutomaticDimension;

而且效果很好

【讨论】:

以上是关于iOS + Swift 2:UITableViewCell 中的动态高度不适用于空视图的主要内容,如果未能解决你的问题,请参考以下文章

ios开发系列之Swift_UI_UITableView

iOS开发之UITableView的使用(swift)

iOS开发之UITableView的使用(swift)

iOS开发之UITableView的使用(swift)

iOS / Swift 3.0:如何确定 UITableView 中当前可见的行?

UITableView 不滚动到底部(Swift IOS)