首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UITableView动态单元高度在过渡或旋转时中断

UITableView动态单元高度在过渡或旋转时中断
EN

Stack Overflow用户
提问于 2014-11-06 07:40:34
回答 5查看 6.1K关注 0票数 7

目前,我正在混乱的快速和动态的表格单元高度。我在xcode6.1上为iOS8.1开发了一个简单的应用程序:https://github.com/ArtworkAD/DynamicCellTest

因此,为了实现一个单元格高度,它与单元格的内容一起延伸,我执行以下操作:

  • 在故事板中,将标签行设置为0。
  • 将标签字体设置为系统
  • 为单元格中的标签设置约束
  • 添加self.tableView.rowHeight = UITableViewAutomaticDimension
  • 不要覆盖heightForRowAtIndex方法

需要最低限度的代码:

代码语言:javascript
运行
复制
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
    }
}

左边的图像显示上述代码的结果。细胞高度随着标签的内容而增加,一切都很好。但是,当您单击“详细信息”视图的“泄露”指示器并再次移回时,您将得到正确的图像。为什么会发生这种事?

解决此问题的一个错误解决方案是重写此方法:

代码语言:javascript
运行
复制
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并测试出来。

EN

回答 5

Stack Overflow用户

发布于 2014-11-06 08:49:51

增加这一点似乎可以解决旋转问题。

代码语言:javascript
运行
复制
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    self.tableView.estimatedRowHeight = 36.5
}

但是,我有另外一个例子,即单元格中有4个标签,这有相同的旋转问题,添加这还不够,最后我用重新加载可见的单元格替换了self.tableView.estimatedRowHeight = 36.5

票数 4
EN

Stack Overflow用户

发布于 2014-12-19 07:45:42

我刚刚通过在tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath)对象中重写UITableViewDelegate解决了这个问题。

代码语言:javascript
运行
复制
func tableView(tableView: UITableView, 
               estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) 
               -> CGFloat {
    return 200
}

更改确切的返回值显然没有任何效果。单元格总是具有适当的自调整大小。我不知道为什么提供估计高度会导致自动收费表开始,但它确实。iOS 8.1.2,Xcode 6.1。

票数 1
EN

Stack Overflow用户

发布于 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,这告诉标签它首选的最大宽度,这样它就可以计算多行文本所需的高度。通常,您会在表视图单元格子类中这样做。

我已经在你的项目中测试过这个了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26774126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档