UISliderの値に従ってセルを表示するテーブルビューを実装しようとしています。
例:テーブルは空です。ユーザーはスライダーを400の値まですばやくドラッグします。これで、テーブルには400行が含まれるはずです。
セルに表示する必要のあるデータはコアデータに保存され、約400のエントリがあります。スライダーをドラッグするときにクールな効果を実現しようとしているので、追加されている各セルを視覚的に確認できます(もちろん、セルが表示されるテーブルビューの部分を表示している場合)。使用時に提供される組み込みのアニメーション- (void) reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation
で十分であり、1〜10行の間で効果がクールに見えます。
問題:値が10以上に達すると、ラグが大きくなりすぎて機能しなくなります。これは、reloadSections:スライダーの値が変わるたびにすべてのセルをチェックする必要があり、貴重な時間を失いすぎているためだと思います。
だから、私はこれを実装する方法についてのアイデアを探しています。NSFetchedResultsControllerを使用して、スライダーが値を変更するたびにフェッチ要求を変更する必要がありますか(これは1秒間に20回発生する可能性があります)?すべてのデータを配列にロードし、セルを標準的な方法で再利用する必要がありますか?
私は両方の方法を試しましたが、ラグはほとんど同じです。問題はreloadSection:が遅すぎることかもしれないと思っています。それがより良い選択だと思い- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
ますが、これを実装する方法についてもっとアイデアを探しています。
どんな助けでもいただければ幸いです!
スライダーが値を変更したときにテストした最後のコード:
- (IBAction) sliderChangedValue:(UISlider *)slider
{
// Make sure we only run this function on integer changes. It fires too often on float changes.
if ((int)slider.value == lastSliderIntegerValue) {
return;
}
if (slider.value > lastSliderIntegerValue) {
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(int)slider.value inSection:0]]
withRowAnimation:UITableViewRowAnimationAutomatic];
}
else {
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(int)slider.value inSection:0]]
withRowAnimation:UITableViewRowAnimationAutomatic];
}
lastSliderIntegerValue = (int)slider.value;