2009-07-15 7 views
1

MVC/OOPデザインパターンでは、プロパティを設定しないと、オブジェクトにプロパティを設定するよう依頼されます。同様に、ココアでは、オブジェクトを描画するときにオブジェクトを指示しません。あなたのオブジェクトのコードでは、それ自体が描画される方法を詳述しているので、(ほとんどの場合)描画すると決定するフレームワークを信頼しています。MVC/OOPパターンへのCocoaアニメーションの適用

しかし、ココア(特にCocoa-Touch)のアニメーションに関しては、オブジェクトビューコントローラ内からオブジェクトを引き出すときは、今度はを制御する必要があるようです。 UIViewサブクラスに値を変更するようメッセージを送信してから、それをゆっくりと持続させる(duration = X)プロパティに応じて自身を新しい位置、アルファ、回転などにアニメートする変更。または私はできますか?

基本的には、プロパティを設定してから離れていく方法を探しています。代わりに、私はいくつかの種類のアニメーションブロックでそのプロパティを変更するように要求するオブジェクトを呼び出すコードをラップする必要があるようです "[UIView beginAnimations:nil context:NULL]; ... [UIView commitAnimations];"

私のビューコントローラではたくさんのアニメーションブロックが終了していますが、私のビューオブジェクトでは何もありません...私はこれが事態がどのように行われているかを確認するために、何かを見落とさない。私はCocoa-Touch内のUIViewアニメーションよりはるかに遠くはないので、おそらくそれが私の問題です。

答えて

0

UIViewはデフォルトでCALayerのようにプロパティの変更をアニメーション化しませんが、これはMVCの中断を示しているとは思われません。コントローラは、ビューに変換する方法を指示することが適切です。コントローラーがビューの正しいフレームを認識し、レイアウトを管理することが適切であることは、コントローラークラスの役割です。 UIViewクラスではなく、-beginAnimations:context:というインスタンスを呼び出すのはちょっと変わったことに同意しますが、実際には多くのビューを一緒にアニメーション化したいので、実際にはもっとうまく機能します。

つまり、サブビューのレイアウトを管理するUIViewサブクラスがあれば、UIViewControllerに頼るのではなく、UIViewでアニメーションを管理できるようにすることに何も問題はありません。だから、これはどちらかの場所に行くことができるものですが、実際にはあなたが発見したようにコントローラに一般的に入ります。

ここでは、典型的なココアの意味で「MVC」を使用しています。あなたはこれがSmallTalkプログラムでは適切ではないかもしれないが、SmallTalk Controllersははるかに制限された役割(ユーザー入力イベントの管理)を持っているということは間違いありません。 CocoaはMVCでのControllerの役割を大きく広げています。コントローラやViewのいずれかに入る機能があることを意味していても、改善されていると思います。

+0

私はCALayersをよく見ていません。彼らが私をここで助けてくれるかどうかは分かりません。私の混乱のため申し訳ありません...しかし、私はUIViewのサブクラスを持っています。私はいくつかの状態を設定することが可能かどうか(fillColor = greenColorと言う)、それから "離れていく"と思っています。このuiviewは自身を描画する方法を知っていて、そのパスをgreenColorで塗りつぶしますが、その変更をアニメーション化しません。ただ瞬時に緑色に変わります。私がアニメーション化することがわかる唯一の方法は、VCのアニメーションブロックを設定することです。 – Meltemi

+0

UIViewのレイヤーを要求することで、レイヤーが自動的にアニメーション化されるため、変更(aView.layer.backgroundColor)を行うことで、必要なものを手に入れることができます。つまり、アニメーションブロックの設定には何も問題はありません。 –

+0

私の意見では、これは残念なことにココアタッチで避けられないMVC原則に違反しています。コントローラーは、ビューが変更されるべきとき*を決めるべきですが、ビューの責任であるため変更する必要はありません。 – adrin

関連する問題