随着新行的添加,保持UITableView滚动到底部
问题描述:
我正在处理的应用程序的一部分涉及一个消息接口,我尝试使其类似于iOS消息应用程序的接口。当收到或发送新邮件时,我希望表格视图向下滚动并显示插入动画。随着新行的添加,保持UITableView滚动到底部
到目前为止,我已经基本上做到了这一点:
- (void)didReceiveNewMessage:(...) {
[messages addObject:...]; // add the new message to an array
NSIndexPath *newIndexPath = [NSIndexPath ...]; // find out where the new cell goes
[tableView insertRowAtIndexPath:newIndexPath ...]; // animate the insertion of the new message
[tableView scrollToRowAtIndexPath:newIndexPath ...]; // do the scrolling
}
这个工作,如果消息被慢慢英寸但是,如果我真的很快就给自己发送了一堆消息,我注意到表格视图会“变得混乱”。
例如,如果我快速发送消息1,2,3,4,5,6,表格视图将动画插入1,2,3和4,然后停止滚动。如果我实际上手动滚动表格视图,我可以看到下面的5和6。任何人都知道更好的方法来做到这一点?
我曾尝试setContentOffset:
来滚动表视图,但是这有同样的效果。
答
这里的根本问题是我很懒,并且使用CGAffineTransformMakeTranslation
而不是手动计算新帧,因为我忘记了当transform
属性发生更改时,帧根据Apple文档变成“未定义”。
它结束了工作好,直到大量的消息进来,在这一点上表视图的框架会弄乱和偏移某种方式,这将导致表视图的底部显示略低于应该已经。
获得的经验:不要在一个动画中混合帧计算和变换。要么保持一切以帧为单位,要么保持一切就转换而言,并使用center
+ bounds
。
你是否异步调用此方法? – Iducool 2012-07-16 08:32:08
尝试调用scrollToRowAtIndexPath fist,然后insertRowAtIndexPath。 – 2012-07-16 08:37:19
如果您发现这是同步问题,请添加[tableView peformSelectorOnMainThread:@selector(reloadData)];但是,我不确定其重新装载数据实际上会分别回滚到位置1还是位置0。 – 2012-07-16 08:40:49