在设置为Autoresize的tableView中插入会导致滚动问题
我有几天的问题,我真的不能解释为什么会这样。
我正在做一个聊天 ,build立一个tableView ,打印消息到单元格。 这些单元格与原型devise,有3种不同的types( 但无论如何不重要 )。 文本是键入 ,消息发送 ,单元格插入表中,然后我们滚动到 tableView 的底部 。
如您所知,在聊天视图中,消息的容器必须适合该文本(这是一个视图),然后单元格必须适合此容器(标签为橙色,容器为紫色)。
这个容器具有可变的高度,并沿着文本生长,从而改变单元高度。
-
我为自动布局显示设置了许多约束条件,但是我没有与项目中为其初始设置的高度(没有自适应行为)不同的单元高度。 聊天消息被切断。
-
所以,我尝试使用
heightForRowAtIndexPath
方法来设置每个rowHeight,沿着文本大小计算约束,但它创build了一个真正的不良行为(例如滚动时更改单元格)。 大小往往是错误的计算/重新计算。 -
这就是为什么我最终使用
estimatedRowHeight
设置为44
与UITableViewAutomaticDimension
结合。 这里有窍门! 哇! 但这并不像预期的那样好
当表格视图出现时,一切都很好。 容器符合他们的标签,行高适合他们的容器,而且很漂亮。 插入过程中出现问题。 经过多次testing后,我注意到只有当多行标签保留在表格视图中时才会出现这种不良行为。
在插入过程中,每个单元格在调整其高度到内容之前似乎调整为44,然后与之前创build的表格视图的滚动状态相比创build一个空白:
如果我改变estimatedRowHeight
就会造成最坏的情况。
我可以显示我的代码,如果你想,但我不认为这将是非常有用的,因为我没有使用复杂的function..只插入,单元格自动高度和向下滚动这是函数委托tableView。
你能帮我吗 ? 真的我不知道如何改变这一点..每一个聊天应用程序的伎俩,但我找不到方法。
谢谢你的回答,请原谅我的英文水平我是一个可怜的法国学生..
如果你需要一些代码评论,我会给它。
我认为你可以cachingcellForRowAtIndex方法中的每个单元格的高度值,并在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 } }