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 中的动态高度不适用于空视图的主要内容,如果未能解决你的问题,请参考以下文章