25

ユーザーがセグメント化されたコントロールに触れたときに、データ ソースとデリゲートがいくつかのカスタム データ ソース オブジェクト間で切り替えられる UITableView があります (アプリ ストア アプリの「Top Paid」と「Top Free」を考えてください)。

各データ ソース オブジェクトは最後のスクロール コンテンツ オフセットを保存し、テーブル ビューのアクティブなデータ ソースになると、次のようにして復元します。

tableView.contentOffset = CGPointMake(0, savedScrollPosition);

これは、テーブルが静止しているときにユーザーがデータ ソースを切り替えるときにうまく機能しますが、テーブルがまだ移動している (つまり、減速している) 間にユーザーがセグメント化されたコントロールを押すと、テーブル ビューは古いオフセットから減速し続け、事実上、私のcontentOffset の割り当て。

contentOffsetを設定したときにテーブルビューのスクロール/減速を強制的に停止する方法、またはこのタイプの切り替え可能なデータソーステーブルビューを機能させる別の方法はありますか?

4

10 に答える 10

20

この2つの方法は試しましたか?

実際には、コンテンツのオフセットだけでなく、「スクロール」にも適用されます。

[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

「減速」プロパティが NO になるのを待って (たとえば、KVO を使用して)、その後切り替えることができます。

于 2009-06-12T13:43:58.523 に答える
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

明らかな回避策の 1 つは、スワップ アウトされる 2 つの別個のテーブル ビューを用意し、各データ ソースをいずれかのテーブル ビューに永続的に接続することです。これはちょっとした記憶の浪費のように思えましたが、おそらく私はそれを考えすぎています.

于 2009-06-12T14:13:56.627 に答える
-3

あなたはやってみることができます

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

これにより、スクロールを無効にして停止し、再度許可する場合があります。私はこれを具体的に試していませんが、同様のことをしました。

于 2009-06-12T13:39:03.790 に答える