我最近一直在聊聊天客户。正如预期的那样,我需要为细胞提供动态高度。我为此使用了自动布局,并在UITableView
self.tableview.estimatedRowHeight = 77.5f;
self.tableview.rowHeight = UITableViewAutomaticDimension;
我也使用inputAccessoryView
for tableView在底部有一个永远存在的UITextView,就像iPhone上的Messages app一样。
contentInset
设置得恰到好处。
当我尝试在
时将tableView
滚动到底部时,问题就开始了
a)首次加载聊天
b)收到一些新邮件时。
对于 a)我已经尝试了各种技术,例如viewDidLoad
,viewDidAppear
,viewWillAppear
等首先使用{{1动画和非动画都是{}或dispatch_after
。但它们只适用于iOS 9而不适用于iOS 8。
对于 b)我将新的聊天消息添加到后备数据存储区,调用performSelector:withObject:afterDelay
并在最后一行之后立即滚动。它适用于iOS 9但不适用于iOS 8.我还尝试reloadData
只插入一个新行。但是,它会在新添加的行和底部布局(带或不带键盘的inputAccessoryView)之间生成一个空白区域。
在iOS 8上,该行的一半仍然是不可见的,有时甚至是多行。我一开始滚动就会调整。
我认为insertRowsAtIndexPaths
在滚动时可能会错误地估计行高。但是,实际的行高是预期的。根本没有删除任何文字。
ViewController本身是tableView
,但我创建了一个UIViewController
实例,用于按here所述添加UITableViewController
。
显然,每当我打电话给'reloadData'在UIRefreshcontrol
,除非我滚动一次,否则它不会正确地进入最后一行。
更新
显然,我必须在iOS 8上实现tableView
并手动确定每个单元格的高度。只有滚动才能正常工作。
答案 0 :(得分:0)
使用此代码滚动到重新加载后的最后一行
[tbl scrollToRowAtIndexPath:[NSIndexPath new] atScrollPosition:UITableViewScrollPositionBottom animated:YES];