2011-07-13 8 views
1

アニメーションブロック内で2つの異なる値にプロパティを2回設定するとどうなりますか?次の擬似コードを実行すると:アニメーション中にプロパティを2回設定する

myView.frame = CGRectMake(0, 0, 50, 50); // state 0 
[UIView beginAnimations:@"showBanner" context:NULL]; 
{ 
    [UIView setAnimationDuration:2]; 
    myView.frame = CGRectMake(0, 20, 50, 50); // state 1 
    myView.frame = CGRectMake(0, 10, 50, 50); // state 2 
} 
[UIView commitAnimations]; 

次の結果はどれですか?

  1. フレーム状態に状態1から状態0からアニメーションフレームが状態0から直接、状態2、無視状態にアニメーション2
私は結果#2を期待

アニメーションがコミットされたときにプロパティの状態が記録されると思うからです。私は結果#1が起こっていることを示すように見える私のアプリで動作を得ている、したがって私の質問。

答えて

1

を無視し、直接状態2の状態0からアニメーション。

アニメーションブロックは、プロパティの最後の状態変化のみをアニメートします。あなたのケースでは、フレームは状態1から状態2にアニメートされます。

+0

興味深い回答です。それが事実で、最初の状態変化が図書館のどこかで起こる場合、私のアニメーションは悪く見えるようになりますか? –

+0

必ずしもそうではありません。ライブラリの機能に応じて、最初の状態変更を独自のbeginAnimation/commitAnimationトランザクションでラップすることができます。そのトランザクション内で、setAnimationDelegate:およびsetAnimationDidStopSelector:を呼び出して、最初のアニメーションが完了した後に呼び出されるメソッドを識別できます。この方法では、2番目の状態遷移のためにアニメーションをトリガーすることができます。 – cduhn

+0

理想的には、最初の状態遷移を完全に無視したいと思います。それは実際に別のプロパティを変更することによるノックオン効果であり、0から2への希望の遷移が悪く見える原因となっています。何か案は? –

1

(2)フレームが実際に答えは、上記の3 Noneです状態1

0

私はこの質問に対する回答が必要で、ここでは満足できるものは見つかりませんでした。私はこのような小さなサブビューを置い簡単なテスト建て:

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    self.testView = [[UIView alloc] initWithFrame:CGRectMake(0,0,40,40)]; 
    self.testView.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:self.testView]; 
} 

をしてから、このような二つの別のアニメーション提供:

- (void)animateWithSimpleBlock { 

    [UIView animateWithDuration:2 animations:^{ 
     self.testView.frame = CGRectMake(200,200,40,40); 
     self.testView.frame = CGRectMake( 0,300,40,40); 
    }]; 
} 

- (void)animateWithQualifiedBlock { 

    [UIView animateWithDuration:2 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
     self.testView.frame = CGRectMake(200,200,40,40); 
     self.testView.frame = CGRectMake( 0,300,40,40); 
    }]; 
} 

をここで何が起こるかです:animateWithSimpleBlockに、TestViewには、単一のフレームにジャンプします初期0,0の位置から中間位置200,200までの(アニメーションなし)そこから、2秒以上で最後の0,300の位置に移動します。

しかし、animateWithQualifiedBlockは、最初の0,0の位置から最後の0,300の位置にスムーズにtestViewをアニメーション化します。これは私が必要とする動作です(b/c、アニメーションブロックで呼び出されるループメソッドで新しいビュー位置を構築しています)。

関連する問題