以编程方式强制UIScrollView停止滚动,以共享具有多个数据源的表视图

Dan*_*son 25 iphone cocoa-touch uitableview uiscrollview

我有一个UITableView,当用户触摸分段控件时,其数据源和委托在几个自定义数据源对象之间切换(在应用程序商店应用程序中认为"Top Paid"与"Top Free").

每个数据源对象保存其最后一个滚动内容偏移量,并在它成为表视图的活动数据源时通过执行以下操作来恢复它:

tableView.contentOffset = CGPointMake(0, savedScrollPosition);
Run Code Online (Sandbox Code Playgroud)

当用户在桌子静止时切换数据源时,这很有效,但如果用户在桌子仍在移动(即减速)时点击分段控件,则表视图继续从旧偏移减速,有效地覆盖了我的contentOffset赋值.

有没有办法在设置contentOffset时强制表视图停止滚动/减速,或者使这种类型的可切换数据源表视图工作的其他方法?

Cor*_*oyd 19

你尝试过这两种方法吗?

它们实际上适用于"滚动"而不仅仅是内容的偏移.

[self.tableView  scrollToRowAtIndexPath:savedIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
Run Code Online (Sandbox Code Playgroud)

要么:

[self.tableView  scrollRectToVisible:savedFrame animated:NO];
Run Code Online (Sandbox Code Playgroud)

它们实际上应该影响滚动和扩展表的加速度,而不仅仅是屏幕上可见的内容.

  • scrollRectToVisible使用保存的滚动位置作为rect的原点并使用表视图的边界作为高度.滚动*方法以设置内容偏移的方式控制加速度是绝对正确的. (2认同)

Ben*_*ieb 13

你试过用过[view setContentOffset: offset animated: YES]吗?


小智 5

这对我很有用:

if (self.tableView.isDecelerating) {
        NSArray *paths = [self.tableView indexPathsForVisibleRows];
        [self.tableView scrollToRowAtIndexPath:[paths objectAtIndex:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

    }
Run Code Online (Sandbox Code Playgroud)