ユーザーがスクロールすると、UITableviewがセルを動的にロードすることを認めます。スクロール中に各セルをロードしないように、すべてのセルをプリロードする方法があるのだろうか。10個のセルをプリロードする必要があります。これは可能ですか?
5 に答える
テーブルビューセルを初期化し、それらを配列に配置precomputedCells
し、データソースデリゲートメソッドtableView:cellForRowAtIndexPath:
で、を呼び出す代わりに、配列から事前に計算されたセルを返すことができますdequeueReusableCellWithIdentifier:
。(静的テーブルビューで行うのと同様です。)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [self.precomputedCells objectAtIndex:indexPath.row];
}
また、WWDC 2012セッション211「iOSでの同時ユーザーインターフェイスの構築」を参照すると、ユーザーインターフェイスの応答性を維持しながら、バックグラウンドスレッドのテーブルビューセルの内容を入力する方法が示されているので便利です。
元の質問の解決策を探していたので、解決策を共有したいと思いました。
私の場合、次のセルをプリロードするだけで済みました(理由については説明しませんが、正当な理由がありました)。
UITableViewは、割り当てられたUITableViewフレームに収まるだけのセルをレンダリングするようです。
したがって、UITableViewフレームを1セルの高さだけ特大にし、特大の領域を画面外に押し出しました(または、必要に応じてクリップされたUIViewに入れることもできます)。もちろん、これは、テーブルビューをスクロールしたときに、最後のセルが表示されないことを意味します(UITableViewフレームがスーパービューよりも大きいため)。したがって、セルの高さのtableFooterViewにUIViewを追加しました。つまり、テーブルを一番下までスクロールすると、最後のセルがスーパービューの一番下にうまく配置され、追加されたtableFooterViewは画面外に残ります。
もちろん、これは任意の数のセルに適用できます。UITableViewフレームをiOSが最初に計算したcontentSizeにサイズ変更し、同じサイズのtableFooterViewを追加することで、必要に応じてすべてのセルをプリロードするために適用することも可能です。
うまくいけば、これは同じ問題を抱えている他の誰かを助けるでしょう。
Markが提案したように、UITableViewの高さも一時的に変更して、テーブルビューが十分な再利用可能なセルを作成するようにしました。次に、テーブルビューの高さをリセットして、スクロール中に再利用可能なセルの作成を停止します。
これを実現するために、デフォルトでfalseに設定されているヘルパーboolを作成します。
var didPreloadCells = false
テーブルビューが最初にデータをリロードしたため、最初の再利用可能なセルが作成されたときにtrueに設定されます。
resultsHandler.doSearch { (resultDict, error) -> Void in
[...]
self.tableView.reloadData()
self.didPreloadCells = true
[...]
}
本当のトリックは私のviewDidLayoutSubviewsメソッドで起こります。ここでは、ブール値に応じてテーブルビューのフレームを設定します。再利用可能なセルがまだ作成されていない場合は、テーブルビューのフレームを増やします。他の場合は通常のフレームを設定します
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.tableView.frame = self.view.bounds
if !didPreloadCells
{
self.tableView.frame.size.height += ResultCellHeight
}
}
その助けを借りて、テーブルビューは通常よりも多くの初期の再利用可能なセルを作成し、追加のセルを作成する必要がないため、スクロールはスムーズで流暢です。
テーブルビューを再利用する場合は、dequeueReusableCellWithIdentifierを変更してください。変更しないと、古いデータが読み込まれます。
セルの自動サイズ変更のためのソリューション。'estimatedRowHeight'を低い値に変更します
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 32; //Actual is 64
}
実際の推定高さは64です。32は、スクロール開始時の遅延を回避するために再利用するセルを追加するために使用されます