2011-12-04 1 views
0

私が作成したこの簡単なカスタムTUIScrollViewクラス(TwUIオープンソースプロジェクトから、非常によく似たUIScrollViewから)でサイズ変更トグルアニメーションを作成しようとしています。それはTUILayoutと呼ばれ、垂直レイアウト、アニメーション挿入と削除だけでなく水平レイアウトもサポートしており、委任よりも好きなセルにデータを提供する宣言的な方法があります。 TUITableViewやUITableViewに似たビューをリサイクルします。とにかくあなたがフォローしたいならば、それはただのクラスであり、ここにいます。スクロールビューでアニメーションのサイズを変更します

https://github.com/mrjjwright/TUILayout

例のコードでは、ユーザーは左下の青色のボタンをクリックし、すべての行が滑らかに縮小され、ユーザーが行の順序を変更したり削除したりすることができます(例の行を右クリックしてアクション)などの操作を行います。次に、ユーザーは青のボタンを再度クリックして行を元のサイズに戻します。

私は最初に、行を表すモデルオブジェクトのサイズを変更し、TUIScrollViewでcontentSizeを再計算して設定し、すべての新しいビューを循環させます(たとえば、10個のビューが縮小ビューに収まるようになります)。 addSubviewは10回呼び出されます)、最後に、すべてのビューのフレームをlayoutSubviewsのサイズと位置にアニメーション化します。

結果として、スクロールバーがスクロールバーが表示されなくなったサイズに正しく縮小され、画面上に表示されているビューが縮小されたサイズにスムーズにアニメーション表示されますが、visibleRectアニメーションに追加できる新しく追加されたサブビューサブビューの1ブロックとしてはるか後である。

新しく追加されたすべてのサブビューは、画面上に表示されていたビューの後ろにあるので、なぜアニメーションが一緒に起こっているのかわかりません。私はCATransactionsを含む運がない物のコンボをたくさん試しました。私は、CAScrollLayerがどのように動作するか、または誰かが私がこれを考えて助けることができるかどうかについて疑問に思っています。

より一般的な問題は、ビューをリサイクルするスクロールビューでリサイズアニメーションをスムーズに処理する方法です.iOSの世界でいくつかの他のグリッドを見て、もっとインスピレーションを得ていますが、もっと探しています。

ありがとうございます!

答えて

1

私はここに自分の問題を解決したかもしれないと思う(私は今朝私のベッドを作っていたので、それは私に当たった)。私は現在のrunloopを必要なすべてのサブビューでサイクリングした後に実行し、非常に重要なのは、実行ループが完了してアニメーションに必要なサブビューを追加するまでscrollviewのcontentSizeを設定しないことです。発射する実行ループを得るために、私はthis SO questionからトリックを使用:

skipLayout = YES; 
[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]]; 
skipLayout = NO; 

skipLayout場合は追加したビューは、直ちにリサイクルレイアウトコードによって除去されないようにだけlayoutSubviewsから返しTUILayout設定されています。実行ループを強制的に実行すると、すべてのサブビューがアニメーションの画面に表示されます。その後、私はリサイズのアニメーションレイアウトを実行しました。もし誰かが興味があれば、githubのコードを更新しました。私はこの質問をしばらく開いたままにして、さらなる洞察力を得るでしょう。

関連する問題