随着新行的添加,保持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:来滚动表视图,但是这有同样的效果。

+0

你是否异步调用此方法? – Iducool 2012-07-16 08:32:08

+0

尝试调用scrollToRowAtIndexPath fist,然后insertRowAtIndexPath。 – 2012-07-16 08:37:19

+0

如果您发现这是同步问题,请添加[tableView peformSelectorOnMainThread:@selector(reloadData)];但是,我不确定其重新装载数据实际上会分别回滚到位置1还是位置0。 – 2012-07-16 08:40:49

这里的根本问题是我很懒,并且使用CGAffineTransformMakeTranslation而不是手动计算新帧,因为我忘记了当transform属性发生更改时,帧根据Apple文档变成“未定义”。

它结束了工作好,直到大量的消息进来,在这一点上表视图的框架会弄乱和偏移某种方式,这将导致表视图的底部显示略低于应该已经。

获得的经验:不要在一个动画中混合帧计算和变换。要么保持一切以帧为单位,要么保持一切就转换而言,并使用center + bounds