当前位置:  开发笔记 > 编程语言 > 正文

UITableView滚动到底部以查看插入动画

如何解决《UITableView滚动到底部以查看插入动画》经验,为你挑选了3个好方法。

我有一个UITableView,我正在添加一行动画(使用insertRowsAtIndexPaths:withRowAnimation:).只要表格不长于屏幕,这一切都很好.

如果它比屏幕大,那么我试图滚动到底部,但它不是我想要的工作.如果我在添加后滚动到新行,我会想念动画.如果我尝试在添加之前滚动到该indexPath,它会抛出异常(关于它不是有效的indexPath)

除了添加空白行之外,还有其他解决方案吗?



1> 小智..:

是的,有一个没有添加空行的解决方案.

注意:在代码中,我认为只有1个部分但很多行.您也可以修改代码以管理多个部分.

- (void)theMethodInWhichYouInsertARowInTheTableView
{
     //Add the object in the array which feeds the tableview
     NSString *newStringObject = @"New Object";
     [arrayWhichFeeds addObject:newStringObject];

     [myTableView beginUpdates]; 

     NSArray *paths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:([arrayWhichFeeds count] - 1) inSection:0]];
     [myTableView insertRowsAtIndexPaths:paths withRowAnimation:NO];

     [myTableView endUpdates];
     [myTableView reloadData];
     [myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([arrayWhichFeeds count] - 1) inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];   
}


`-insertRowsAtIndexPaths:withRowAnimation:`的第二个参数不是`BOOL`; 它是一个`UITableViewRowAnimation`类型
我仍然没有看到使用这种技术添加动画.它滚动得很好,但即使我为withRowAnimation传递一个有效值(不是"NO",但是UITableViewRowAnimationFade)我也从来没有看到它发生过.问题(我认为)是如何滚动并仍然看到添加动画(对吧?)

2> CaseyB..:

我有同样的问题.这是我的解决方案.

首先 - 更新您的数据源

第二 -

NSIndexPath *path = [NSIndexPath indexPathForRow:([arrayWhichFeeds count] - 1 inSection:0]];
NSArray *paths = [NSArray arrayWithObject:path];
[myTableView insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationTop]; 
[myTableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionBottom animated:YES];

*请注意,这不是包裹在[tableView beginUpdades][tableView endUpdates]代码.如果你这样做将无法按预期工作.

尝试一下,它应该在滚动到它们的同时从底部动画新的行.


不适用于自动高度单元

3> Aardvark..:

其他技术,包括在这个问题下提到的那些技术对我来说不起作用.但这确实如此:

    将新项添加到内部dataSource集合.

    在项目中设置一个标志,表示它是"新".设置此标志时,强制显示单元格以不显示任何内容.

    立即调用tableView:reloadData:

    现在新项目在此表中,但在视觉上显示为空(由于标志).

    使用tableView.indexPathsForVisibleRows检查此新项是否可见.

    如果项目在屏幕上,则立即将dataSource项目上的"new"标志翻转为NO,并使用动画集调用tableView:reloadRowsAtIndexPaths.现在看起来好像刚刚添加了这个项目.(你在这种情况下完成了)

    如果它不在屏幕上使用tableView滚动到视图:scrollToRowAtIndexPath:但不要立即调用reloadRowsAtIndexPath ...

    处理消息(void)scrollViewDidEndScrollingAnimation:并从步骤6执行相同的reloadRowsAtIndexPath.我怀疑在滚动发生时调用此方法,因此您必须检测何时从步骤7调用它以及何时调用它因为用户正在滚动.

当我第一次开始iOS开发时,我使用了这种技术(并写了这个答案),但这确实是长期的.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有