web-dev-qa-db-ja.com

成功せずにUIViewをフェードインしようとしています

メインビューのサブビューとしてUIViewをフェードインしようとしています。フェードインしようとしているUIViewのサイズは320x55です。

ビューとタイマーを設定します。

secondView.frame = CGRectMake(0, 361, 320, 55);
secondView.alpha = 0.0;
[self.view addSubview:secondView];
[NSTimer scheduledTimerWithTimeInterval:.5 target:self selector:@selector(fadeView) userInfo:NO repeats:NO];

タイマーは次のコードをトリガーします。

secondView.alpha = 1.0;
CABasicAnimation *fadeInAnimation;
fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeInAnimation.duration = 1.5;
fadeInAnimation.fromValue = [NSNumber numberWithFloat:0.0];
fadeInAnimation.toValue = [NSNumber numberWithFloat:1.0];
[fadeInAnimation setDelegate:self];
[secondView.layer addAnimation:fadeInAnimation forKey:@"animateOpacity"];

私のsecondViewはInterfaceBuilderに接続されており、他のメッセージに応答しますが、画面上で何が起こっているのかわかりません。

誰かが私がここで何が起こっているのか理解するのを手伝ってくれませんか?

ありがとう、リッキー。


次の推奨事項への返信:

ここでは少しわかりません。最初にこのコードを入れました(secondViewがUIViewのインスタンスとして表示されるためですか?):

[secondView beginAnimations:nil context:NULL]; 
[secondView setAnimationDuration:0.5]; 
[secondView setAlpha:1.0]; 
[secondView commitAnimations]; 

次に、警告やエラーを生成しなかった提案を試しましたが、それでも表面には何も表示されません。

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:0.5]; 
[secondView setAlpha:1.0]; 
[UIView commitAnimations]; 

ありがとう!リッキー。


19
Ricky

これはもう少し簡単にできるはずです。このようなことを試しましたか?

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[secondView setAlpha:1.0];
[UIView commitAnimations];
43
kubi

あなたが見逃していることの1つは、ビューのアルファがすでに1.0になっている可能性があることです。アニメーションを呼び出す前に、アルファが0(または希望するもの)であることを確認してください。

私はこれにブロックアニメーションを使用することを好みます。それはよりクリーンでより自己完結型です。

secondView.alpha = 0.0f;
[UIView animateWithDuration:1.5 animations:^() {
    secondView.alpha = 1.0f;
}];
16
steveb

CoreAnimationsの使用を主張する場合、これはあなたの質問に答えませんが、iPhoneOSの場合、UIViewアニメーションにアニメーションブロックを使用する方がはるかに簡単です。

secondView.alpha = 0.0f;
[UIView beginAnimations:@"fadeInSecondView" context:NULL];
[UIView setAnimationDuration:1.5];
secondView.alpha = 1.0f;
[UIView commitAnimations];

また、遅延時間でデリゲートを呼び出すことができます

[self performSelector:@selector(fadeView) withObject:nil afterDelay:0.5];
11
kennytm

これは、多くのオプションがあり、使いやすい優れた代替手段でもあります。

  [secondViewController.view setAlpha:0.0];
  [UIView animateWithDuration:1.5
          delay:0.0 
          options:UIViewAnimationOptionCurveEaseIn // See other options
          animations:^{
            [secondViewController.view setAlpha:1.0];
        } 
        completion:^(BOOL finished) {
        // Completion Block
        }];
8
NaXir