web-dev-qa-db-ja.com

UITableViewのスクロール位置を記憶する

XcodeのiOSアプリに少し問題があります。数百のセルをロードするUITableViewがあります。特定のセルまでスクロールダウンし、detailedviewcontrollersにドリルダウンして再び戻ると、マスタービューテーブルが一番上に戻りました。同様の2つの質問を見てきました。

保存できるようにUITableViewスクロール位置を取得するにはどうすればよいですか?

ITableViewでのスクロール位置の設定

私はまだこれらを機能させることができません。私は経験豊富なコーダーではないので、これに本当に苦労しています。

ViewWillDisappearやviewDidAppearのようなものを変更する必要があることは知っていますが、それ以上のことはできません。

このテーブルにはreloadData機能があるため、サーバーから最新のデータを取得したり、検索バーを使用したりできます。

とにかく、救いの手は素晴らしいでしょう。ありがとう、

ルカ

30
mylogon

ソート済み!

Desdenovaから少しインスピレーションを得て、仕事中に私はそれについてよく考え、何ができるかを実感しました。検索バーがあることを思い出して、数か月前に次のコードを実装して非表示にしました。

[self.tableView setContentOffset:CGPointMake(0,-20) animated:NO];

単純に、viewDidAppearではなくviewDidLoadに入れました。明らかに、これは検索バーを非表示にしましたが、間違ったvoidコマンドになっていると、masterDetailViewがスタックの最上部に戻るたびにそれを実行しました。したがって、上記のコードをviewDidLoadに移動した後も、非表示になりますが、一度だけです。

私は、同じ問題に出くわし、正気を保つかもしれない、私のような他の初心者のために、このように綴っているだけです!

助けてくれたあなたのアイデアに感謝します。

あなたのすべてに+1!

12
mylogon

ここを参照して、最初にtableViewのスクロール位置、つまりcontentOffsettableViewを保存し、tableViewに戻ったときに再使用する必要があります。

1)いつ、どこに保存するか:

WhendetailViewControllerにドリルダウンする時点で、contentOffsettableViewを保存します

方法float verticalContentOffset = tableView.contentOffset.y;

2)tableViewを同じスクロール位置に戻す方法:

[tableView setContentOffset:CGPointMake(0, verticalContentOffset)];

これがあなたを助けることを願っています。

67
Prashant Nikam

誰かが疑問に思っているなら、私はPrashant Nによる解決策を試してみましたが、うまくいきました。ただし、reloadDataは実際にはスクロール位置をリセットしないため、reloadData以外の操作は必要ありませんでした。

1
Enrico Susatyo

何らかの理由で、これは私にとって中途半端な作業でした(場合によっては、位置が近似値に過ぎないこともあります)。私は最終的に次のものを先験的にあまりクリーンでないソリューションを使用しました

NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0];
[self.tableView scrollToRowAtIndexPath:self.firstVisibleIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
self.firstVisibleIndexPath = firstVisibleIndexPath;

うまくいきました。

1
vib

この問題に対する私の解決策は、最後のアイテムのインデックス行までテーブルをスクロールすることでした。

private func scrollToItem(item:Int, section:Int bottom:Bool = true, animated:Bool = false) {
    let indexPath = NSIndexPath(forRow: item:Int-1, inSection: section)
    var position = UITableViewScrollPosition.Bottom
    if (!bottom) { position = UITableViewScrollPosition.Top }
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: position, animated: animated)
}
1

他のコメントで述べたように、UINavigationControllerの戻るナビゲーションの一番上へのスクロールはデフォルトの動作ではありません。

別の原因としては、viewWillAppearの最初のレスポンダーとしてテーブルの上部近くにセルを設定していることが考えられます。テーブルの上部にある検索ボックスまたは編集フィールド。 UITableViewControllerは、ファーストレスポンダーを自動的にスクロールして表示します。これは素晴らしいことです。それがあなたがやろうとしていることである限り。 :)それがあなたが望むものでない限り、viewWillAppearで最初のレスポンダーを設定しないように注意してください。乾杯、アリゾナ

0
andyzei

コレクションの私の決定:

CGFloat oldCollectionViewHeight = self.messageCollectionView.contentSize.height;

[self.messageCollectionView reloadData];
[self.messageCollectionView layoutIfNeeded];

CGFloat newCollectionViewHeight = self.messageCollectionView.contentSize.height;

if (oldCollectionViewHeight) {
    self.messageCollectionView.contentOffset = CGPointMake(0, newCollectionViewHeight - oldCollectionViewHeight);
}

表については、原則は同じです。

0
Dmitry Malysh

あなたは何もする必要はありません。同じView Controllerにいる間、あなたの位置は同じになります。 View ControllerのどこかがreloadDataと呼ばれているのではないかと思います。 scrollToRowAtIndexPathを呼び出すメソッドを検索します。

0
aph340