iPhone SDK - 如何以编程方式带动画滚动UITableView?

12

我该如何通过动画来将UITableView滚动到特定位置?

目前,我正在使用以下代码跳转到某个位置:

 //tableController -> viewDidLoad
 [self.tableView reloadData];
 NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0];
 [self.tableView scrollToRowAtIndexPath:indexPath
                       atScrollPosition:UITableViewScrollPositionTop
                               animated:YES];

这段代码的问题是,表格会立即跳转到正确的位置,没有任何动画效果。有没有办法启用动画或设置持续时间?

感谢任何帮助。

4个回答

23

对我来说它正常工作:

-(void) viewDidAppear:(BOOL)animated{
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:n inSection:0];
    [self.tableView scrollToRowAtIndexPath:indexPath
                    atScrollPosition:UITableViewScrollPositionTop
                            animated:YES];

}

为确保该函数仅被调用一次,您可以进行如下验证:

if(!isInitialized){
   isInitialized = YES;
   ....
}

5

尝试将reloadData调用注释掉。如果我正确理解了您的问题,并且您在viewDidLoad中,您根本不需要调用它。

此外,如果您刚刚完成推送视图控制器,则不会获得动画滚动效果。在viewDidLoad被调用和动画开始之间插入延迟(我发现1/4秒效果很好)。


0

我有两个建议供您调查:

  1. 您是在模拟器上运行应用程序还是在 iPhone 上运行?我注意到一些动画在模拟器中的表现不同。

  2. 您是否可能在快速连续调用 scrollToRowAtIndexPath:atScrollPosition:animated 函数?这可能会“混淆”动画。您应该在处理给定事件时仅调用此函数一次。


谢谢您的回复。我正在设备上运行代码,并在viewDidLoad方法中调用此代码。 - dan
可能由于某种原因,动画无法从viewDidLoad开始,因为这是视图初始化的一部分。我不是说我确切知道为什么会这样,但听起来很有道理。尝试使用NSRunLoop的performSelector安排一个事件,并在调用该事件时进行滚动。 - richb

0

我知道可能有点晚了,但也许对其他人有帮助, 现在你可以使用[tableView scrollsToTop]来滚动表格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接