【问题标题】:Insert in a tableView set to Autoresize cause a scroll issue在设置为 Autoresize 的 tableView 中插入会导致滚动问题
【发布时间】:2016-06-16 02:23:26
【问题描述】:

我有一个问题好几天了,我真的无法解释为什么会这样。

我正在进行聊天,设置了 tableView,将消息打印到单元格中。这些单元是用原型设计的,有 3 种不同的类型(但无论如何都没有关系)。 输入文本,发送消息,插入表格中的单元格,然后我们滚动到底部表格视图。

如您所知,在聊天视图中,消息的容器必须适合此文本(即视图),然后单元格必须适合此容器(橙色标签,紫色容器)。

此容器有一个可变高度,并沿文本增长,改变单元格高度。

  • 我为 auto-layout 显示设置了许多约束,但我没有与我最初在项目中设置的高度不同的单元格高度(没有自适应行为)。聊天消息被剪掉了。

  • 1234563尺寸经常被错误计算/重新计算。
  • 这就是为什么我最终将estimatedRowHeight 设置为44UITableViewAutomaticDimension 结合使用。在这里它成功了!哇哦!但是没有想象中那么好。。

当表格视图出现时,一切都很好。容器适合他们的标签,行的高度适合他们的容器,而且很漂亮。插入过程中出现问题。 经过多次测试,我注意到这种不良行为仅在 multilines label 保留在表格视图中时出现。

在插入期间,每个单元格似乎在调整其高度以适应内容之前调整为 44,然后与之前的状态相比创建一个间隙,从而创建一个奇怪的表格视图滚动:

如果我更改 estimatedRowHeight,情况会变得更糟。

如果你愿意,我可以显示我的代码,但我认为它在这里不会很有用,因为我没有使用复杂的函数。只有插入、单元格的自动高度和向下滚动,这些是 tableView 的委托函数.

你能帮帮我吗?真的我不知道如何改变它..每个聊天应用程序都可以解决问题,但我找不到方法。

谢谢你的回答,原谅我的英语水平我是一个可怜的法国学生..

如果你需要一些代码注释,我会给它。

【问题讨论】:

    标签: ios xcode swift uitableview


    【解决方案1】:

    我认为您可以在 cellForRowAtIndex 方法中为每个单元格缓存高度值,并在 HeightForRowAtIndex 中为该单元格设置相应的高度。

    你可以这样做:

    var cellCached = Dictionary<Int,AnyObject>()
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
    table.rowHeight = yourCell.yourLabel.frame.origin.y + yourCell.yourLabel.frame.height + 10
    
    cellCached[indexPath.row] = yourTable.rowHeight
    }
    
    
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    
        if(tableView == yourTable)
        {
            if(cellCached[indexPath.row] != nil)
            {
                return cellCached[indexPath.row] as! CGFloat
            }
            else
            {
                return 200
            }
        }
        else
        {
            return UITableViewAutomaticDimension
        }
    
    }
    

    【讨论】:

    • 老兄,谢谢!我的问题没有完全解决(计算单元格高度时出错),我认为有一些小事情需要纠正,但效果消失了,真的很酷!我会尽快告诉你它是否有效。
    • 伙计,我对多行标签有疑问。您是否有解决方案使标签高度适合其内容?
    • 对不起,如果我刚才给您写信,但是是的,我为您找到了解决方案:yourCell.yourlabel?.numberOfLines = 0; yourCell.yourlabel?.sizeToFit();
    • 谢谢,我刚刚找到了这个解决方案。缓存高度是一个真正的好主意,我成功地实现了我想要的。终于成功了,谢谢!!!
    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    相关资源
    最近更新 更多