目前,我正在混乱的快速和动态的表格单元高度。我在xcode6.1上为iOS8.1开发了一个简单的应用程序:https://github.com/ArtworkAD/DynamicCellTest
因此,为了实现一个单元格高度,它与单元格的内容一起延伸,我执行以下操作:
self.tableView.rowHeight = UITableViewAutomaticDimensionheightForRowAtIndex方法需要最低限度的代码:
class MyTableViewController: UITableViewController {
var entries:Array<String> = [String]()
override func viewDidLoad() {
super.viewDidLoad()
//create dummy content
var i = 0
while i < 10 {
entries.append("\(i) Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor")
entries.append("\(i+1) Lorem ipsum dolor sit amet")
i = i + 2;
}
self.tableView.rowHeight = UITableViewAutomaticDimension
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.entries.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("basic_cell", forIndexPath: indexPath) as UITableViewCell
var label = cell.viewWithTag(13)
if let unwrappedLabel = label as? UILabel {
unwrappedLabel.text = self.entries[indexPath.row]
}
return cell
}
}左边的图像显示上述代码的结果。细胞高度随着标签的内容而增加,一切都很好。但是,当您单击“详细信息”视图的“泄露”指示器并再次移回时,您将得到正确的图像。为什么会发生这种事?

解决此问题的一个错误解决方案是重写此方法:
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
self.tableView.reloadData()
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.tableView.reloadData()
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
self.tableView.reloadData()
}这样就解决了上面的问题,但这个解决办法似乎不对?它的一个副作用是,当调用self.tableView.reloadData()时,表视图端口跳转到第一个单元格,这看起来不太好。
有人知道我做错了什么吗?请随时克隆我的回购https://github.com/ArtworkAD/DynamicCellTest并测试出来。
发布于 2014-11-06 08:49:51
增加这一点似乎可以解决旋转问题。
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
self.tableView.estimatedRowHeight = 36.5
}但是,我有另外一个例子,即单元格中有4个标签,这有相同的旋转问题,添加这还不够,最后我用重新加载可见的单元格替换了self.tableView.estimatedRowHeight = 36.5。
发布于 2014-12-19 07:45:42
我刚刚通过在tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath)对象中重写UITableViewDelegate解决了这个问题。
func tableView(tableView: UITableView,
estimatedHeightForRowAtIndexPath indexPath: NSIndexPath)
-> CGFloat {
return 200
}更改确切的返回值显然没有任何效果。单元格总是具有适当的自调整大小。我不知道为什么提供估计高度会导致自动收费表开始,但它确实。iOS 8.1.2,Xcode 6.1。
发布于 2014-11-06 11:01:14
该链接很好地解释了需要做什么。
Using Auto Layout in UITableView for dynamic cell layouts & variable row heights
对于您的具体问题,您缺少了两行代码。
在viewDidLoad中,在tableView.rowHeight下添加self.tableView.estimatedRowHeight = 64
以上将允许tableView为屏幕外单元格分配估计的高度值,以提高性能,并计算滚动条的高度。
主要问题是您在unwrappedLabel.preferredMaxLayoutWidth = CGRectGetWidth(tableView.bounds)中缺少了cellForRowAtIndexPath,这告诉标签它首选的最大宽度,这样它就可以计算多行文本所需的高度。通常,您会在表视图单元格子类中这样做。
我已经在你的项目中测试过这个了
https://stackoverflow.com/questions/26774126
复制相似问题