25

我有一个 UITableView,当用户触摸分段控件时,它的数据源和委托在几个自定义数据源对象之间切换(想想应用商店应用程序中的“热门付费”与“热门免费”)。

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

tableView.contentOffset = CGPointMake(0, savedScrollPosition);

当用户在表格静止时切换数据源时,这很有效,但是如果用户在表格仍在移动(即减速)时点击分段控件,表格视图会继续从旧的偏移量减速,有效地覆盖我的contentOffset 分配。

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

4

10 回答 10

20

这两种方法你试过了吗?

它们实际上适用于“滚动”,而不仅仅是内容的偏移量。

[self.tableView  scrollToRowAtIndexPath:savedIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];

或者:

[self.tableView  scrollRectToVisible:savedFrame animated:NO];

它们实际上应该影响滚动并通过扩展来加速表格,而不仅仅是屏幕上可见的内容。

于 2009-06-12T17:35:06.983 回答
13

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

于 2009-06-12T13:59:57.190 回答
5

这对我很有效:

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

    }
于 2012-04-18T11:21:38.077 回答
4

刚刚发现这个正在寻找一种方法来停止我的 UIScrollView - 我需要移动一些子视图,但是如果用户轻弹屏幕并且它仍在减速,这个伤口看起来不正确。

无论如何-scrollRectToVisible对我不起作用(可能是因为我没有使用表格视图??)但这很有效:

[mainScrollView setContentOffset:CGPointMake(mainScrollView.contentOffset.x, mainScrollView.contentOffset.y) animated:NO];

然后我可以不用担心地做子视图的事情!

于 2010-08-11T13:33:50.907 回答
2

我使用了 Corey 的方法。我用字典表示保存和恢复矩形。此外,它可能并不明显,但要保存和恢复的矩形是UITableView的界限:

// Save the current tableview bounds
CGRect contentRect = self.listTableView.bounds;
if (!!oldScope) [_contentRects setObject:(NSObject *)CGRectCreateDictionaryRepresentation(contentRect) forKey:oldScope];

// Restore if possible
CFDictionaryRef restoredFrameDict = (CFDictionaryRef)[_contentRects objectForKey:newScope];
if (!restoredFrameDict) restoredFrameDict = CGRectCreateDictionaryRepresentation(CGRectZero);
CGRectMakeWithDictionaryRepresentation(restoredFrameDict, &contentRect);

// Switch over to new datasource
self.listTableView.dataSource = [self dataSourceForScope:newScope];
[self.listTableView reloadData];

// Restore content offset for "newScope"; Also stops scrolling
[self.listTableView scrollRectToVisible:contentRect animated:NO];

CFDictionaryRef注意和的可互换使用NSDictionary *

于 2010-05-17T22:59:38.760 回答
0

您可以等待“减速”属性变为“否”(例如,通过使用 KVO)并在此之后切换。

于 2009-06-12T13:43:58.523 回答
0

一个明显的解决方法是让两个单独的表视图被换出,并且每个数据源都永久附加到其中一个表视图。这似乎有点浪费记忆,但也许我想多了。

于 2009-06-12T14:13:56.627 回答
0

当我有一个 UISwitch 作为表格的选择器时,这是我的问题。但是使用分段控制我没有任何问题。也许你没有重新加载表?这是我的一段工作代码:

NSIndexPath *exPath = [[subTable indexPathsForVisibleRows] lastObject]; 

isMatchOn = [whatList selectedSegmentIndex] == 0 ? YES : NO;  //table source will make the choice looking at this BOOL  

[subTable reloadData];  // here tables actually flip

if (lastPosition) {
    [subTable scrollToRowAtIndexPath:lastPosition atScrollPosition:UITableViewScrollPositionBottom animated:NO];   //I scroll to saved index
    }
self.lastPosition = exPath;  //here I save the current position
于 2010-09-15T17:57:58.370 回答
0

self.tableView.isScrollEnabled = true/false当你达到一定的tableView.contentOffset.y价值时你也可以这样做

于 2017-04-07T15:16:53.083 回答
-3

你可以尝试做

tableView.scrollEnabled = NO;
tableView.scrollEnabled = YES;

这可能会通过禁用它来停止滚动,然后再次允许它。我没有专门尝试过,但我做过类似的事情。

于 2009-06-12T13:39:03.790 回答