2009-05-30 16 views
0

スクロール中に多くのオブジェクト(UIImageView's)が表示されるUIScrollViewがあります。しかし、ユーザーがスクロールしているとき、私はこれらのオブジェクトすべてにメッセージを発して、何もばかげてはならないと伝えたいと思う。 UIScrollViewが減速すると、可視オブジェクトでアニメーションが発生します。ユーザーが高速に移動すると(pagingEnabled = YES)、オブジェクトはアニメーション化されています。その結果、恐ろしいスクロールパフォーマンスが発生します。"同じ"時間に30個のオブジェクトをメッセージする最も簡単で最速の方法は何ですか?

ユーザーがスクロールするとすぐにすべてを停止して何もしないように指示します。じゃあどうすればいい? forループは、スクロール時のパフォーマンスが悪いです。それはちょっとばかげてしまいますが、それでユーザーは非常に怒ってしまいます。

答えて

2

また、コンピュータは線形にしかできないことを覚えておいてください。ですから、あなたが何をしていても、何らかのループ制御構造を使用する必要があります。

おそらくループを含むスレッドを開始します。ループは各オブジェクトの

perfomrselectoronmainthread: 

セレクタを呼び出します。 (。それは、メインスレッド上で実行する必要があるUIのもののために覚えている)

と私はあなたがアニメーションを停止するには

+ (void)setAnimationsEnabled:(BOOL)enabled 

を使用しているasume。

まだ十分な速さでない場合は、コアアニメーションを見る必要がありますが、これはこれを可能にする余分な効率があります。

+0

これは甘い解決策です。それはそれが得られるように "同時"に近いものです。 – Naren

4

これらをすべて配列に入れ、[NSArray makeObjectsPerformSelector:]を使用します。それはそれを行う最も簡潔な方法ですが、私はそれ以上のループを使用するよりも効率的であるかどうかはわかりません...

私はあなたのビューをアニメーション化しているかわかりませんが、 UIScrollViewのデリゲートは、目に見えるアイテムのサブアレイを維持し、アニメーションをそれらのアニメーションに限定するように機能します。たとえば、表示される矩形が変わるたびに、既存の表示可能なビューのリストを見て、完全にオフスクリーンであるかどうかを確認できます。それらのアニメーションを止めることができます。画面上にあったがリストにないビューを探して、それらの上でアニメーションを開始することができます。私は前にこのようなことをやったことがあり、パフォーマンスを大幅に向上させるのに役立ちました!

実行中のアニメーションをすべてフリーズするには、アニメーションアニメーションの配列があり、比較的短いです。

希望に役立ちます!

+0

-makeObjectsPerformSelector:forループ内部で使用し、呼び出されるメソッドは、パラメータを取らないなければならないという欠点を持っています。私はすでに同様のことをしています。ここでは、現在表示されているページにあるオブジェクトでのみアニメーションを開始します。つまり、scrollViewのフレーム幅の倍数の四角形です。問題は、ユーザーが速すぎる場合です。それで、古いアニメーションは、新しいアニメーションが始まっても実行されます。私のアニメーションはより複雑になり、ユーザーはより多くのスクロールビューを加速します。だから事はすぐに追加されます;) – Thanks

+0

私はオフスクリーンのすべてを停止することについても考えましたが、問題は次のとおりです。そして、彼/彼女はアニメーションがまだ「減速している」と予想しています。ですから、私はscrollViewのビューポートをアクティブにして、少なくとも0.5ページの範囲を保つ必要がありますが、その範囲外のアニメーションはすべてキャンセルしなければなりません。 – Thanks

+0

引数を指定する必要がある場合は、makeObjectsPerformSelector:withObjectメソッドがあります – monowerker

1

別のスレッドで各メッセージを実行しようとします。もちろん、すべてのUIの更新はメインスレッド上になければなりませんが、バックグラウンドスレッドで何らかの作業を行うことができれば、多少遅れを減らすことができます。 (私は30 +オブジェクトのためにこれがいかに実現可能であるかは言うことができません)

関連する問題