3

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;
4

1 に答える 1

2

私はiOS開発の経験があまりありませんが、多くのゲーム開発を行ってきました。問題の根本は、プログラムがレンダリングしなければならないアニメーションの量にあるようです。このプログラムの動機はクールな効果を維持することであるとあなたが言ったので、ユーザーが知覚できるポイントまでプログラムを最適化するために可能な限りすべてを変更する必要があります。私はそれがあまり明確ではないことを理解しているので、ここに可能な解決策があります:

ユーザーがスライダーを動かすことができるすべての速度に対して、すべての行の追加をアニメーション化するべきではありません。代わりに、エクスペリエンスをスムーズにするために必要な数だけアニメーション化します。これは、スライダーが変更される速度を計算し、reloadDataが呼び出される前にテーブルに追加される行数を調整することで実現できます。サイクルの最後の行の追加のみをアニメートします。

どのシステム用に開発しているのか、またはさまざまなiOSプラットフォームのグラフィックパワーについてはまったくわからないため、具体的な値を示すことはできませんが、さまざまな設定を試して、何が機能するかを確認する必要があります。

于 2012-06-21T18:27:05.330 に答える