2009-07-24 14 views

答えて

6

iPhoneは暗黙のアニメーションをサポートしていますが、アニメータオブジェクトは使用しませんが、UIViewに直接組み込まれています。代わりにこれを試してみてください:

[UIView beginAnimations:nil context:nil]; 
[aView setFrame:NSMakeRect(100.0,100.0,300.0,300.0)]; 
[UIView commitAnimations]; 

正確な詳細はhereと記載されています。

すべてのビューは常にレイヤーバックされているため、明示的なアニメーションのレイヤーを取得するためにレイヤーをオンにする必要はありません。

+0

これは明示的なアニメーションではありませんか?何が違うの? – Thanks

+1

No。明示的なアニメーションは、CoreAnimationを直接使用し、CAAnimationをレイヤーにアタッチするときです。暗黙的なアニメーションは、アニメーションに関するいくつかのパラメータを設定するときです。それ以外の場合は、ビューに通常のプロパティを設定して、システムにアニメーションを適用させます。デスクトップ上で暗黙のアニメーションはプロキシを介してすべてのNSViewを転送することで行われ、UIViewはプロキシを使わずにNSViewを処理する方法を知っていますので、暗黙的なアニメーションをクラスメソッドで構築したいと伝えるだけです。 –

+0

ルイ、あなたは私の英雄です! –

6

iPhone OSは実際にAppleのCore Animation Programming Guideに定義されているCALayerで暗黙のアニメーションをサポートしています。

[view setWantsLayer:YES]; 

をiPhone OSでは、単にあなたがしたいのUIViewの派生オブジェクトをホストするのUIViewController派生クラスに層のデリゲートを設定:Mac OS Xでは、層は、それが設定することで、NSViewのをバックアップしたときにアニメーション可能になりアニメーション化する。例えば、labelというUILabelにプロパティが定義されていて、それをホストするUIViewController派生クラスの内部にあるコードは、次のようになります(UIButton Touch Up Insideイベントのイベントハンドラの例):

-(void) buttonPressedToAnimateTheLabel:(id)sender 
{ 
    CALayer *labelLayer = self.label.layer; 

    labelLayer.delegate = self; 

    layer.position = CGPointMake(labelLayer.position.x, labelLayer.position.y + 50); 
} 

ラベルは、位置を変更するだけで、Mac OS Xとまったく同じ方法でアニメーション表示されます。

このことについていくつかの注意事項:

  1. それは間違い デリゲートではなく、UIViewのある のUIViewControllerです。 デリゲートをUIViewにすると、アプリ が爆発します。 で

  2. デリゲート のUIViewController派生クラスは 完全に完成した負荷を有した後に呼び出さ 方法で設定する必要がある、すなわち、クラスによってホスト制御 のイベントハンドラ。私は をinitWithNibNameに追加しようとしました:bundle :, awakeFromNib、viewDidLoad、 viewWillAppear:animatedそしてそれは が動作しませんでした。 にデリゲートを設定すると、最初の2つのメソッドで ラベルがアニメートされませんでした。 はただちにポジションを変更しました。 最後の2つに追加すると、 ラベルが完全に消えてしまいました。デリゲートは イベントハンドラで一度設定されている

  3. た後、それは のUIViewController派生クラスの生涯の残りのために良いだろう。 他のイベントハンドラのレイヤプロパティを変更すると、レイヤの 代理人を再度設定せずに、 がアニメーション化されます。

  4. のUIViewController派生クラスがフォーカスを失ったとき、デリゲートはviewWillDisappearにnilに設定する必要があります:アニメーションの方法、または他のアプリケーションが

を爆破します設定するには、いくつかの場所が存在しなければなりませんイベントハンドラが呼び出された結果として複数回設定されないように1回だけデリゲートしますが、まだその場所を見つける必要があります。少なくともそれはこの方法で動作し、イベントハンドラが複数回呼び出される結果、複数回設定することは十分に無害に見えます。

これがすべてCore Animation Programming Guideに記載されていれば、確かにいいですね。私はこれを理解しようと数日間過ごしました!これで狩りの手間を省くことができますように!

+0

デリゲートを追加するまでアニメーション化されていないレイヤー(ジャンプする)と同じ問題が発生しました。しかし、私はviewDidLoad()メソッドでデリゲートを設定することができます(少なくともiPadの場合は3.2)、問題なく動作します。 –

+0

私はこれを動作させることができませんでしたが、それは約束を示しています。私はこれについてもっと知りたいと思っています。なぜなら、常にアニメーションブロックを設定しなければならないからです。 –

関連する問題