0

私がやろうとしているのは、タイマーが鳴ったときにラベルをアニメーション化することです。ウィンドウベースのアプリケーションがあります。

  1. while ループでコア アニメーションを試しましたが、プログラムがフリーズするだけです。
  2. タイマー (NSTimer) によってトリガーされるコア アニメーションを試しましたが、何も起こりません。

問題 : プログラムをデバッグしました。すべて正常に見え、すべてのステートメントが実行されていますが、何も起こりません。ループ内またはタイマーによってトリガーされるコアアニメーションは許可されていないと思いました。他の方法はありますか?

私が持っているものは:

drawingTimer = [NSTimer scheduledTimeWithTimeInterval:60.0 target:self
                selector:@selector(slideWords) userInfo:nil repeats:NO];

-void (slideWords){
 randomNumber = 1 + arc4Random()%2;

 if(randomNumber = 1){
    Redlabel.alpha = 1.0;
    RedLabel.frame = CGRectMake(0, -50, 320, 100);
    [UIWindow animateWithDuration:5.0 animations:^{
        Redlabel.alpha = 1.0;
        Redlabel.frame = CGRectMake(0,300,320,100);
    }completion:^(BOOL finished){
        [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{
            Redlabel.alpha = 0.0;
        }completion:^(BOOL finished){
        }];
    }];
 }

 if(randomNumber = 2){
    GreenLabel.alpha = 1.0;
    GreenLabel.frame = CGRectMake(0, -50, 320, 100);
    [UIWindow animateWithDuration:5.0 animations:^{
        GreenLabel.alpha = 1.0;
        GreenLabel.frame = CGRectMake(0,300,320,100);
    }completion:^(BOOL finished){
        [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{
            GreenLabel.alpha = 0.0;
        }completion:^(BOOL finished){
        }];
    }];
 }

}

4

1 に答える 1

1

danh がコメントで述べているように、if ステートメントは両方とも

if (randomNumber == value)

単一の等号は比較演算子ではなく、代入演算子です。コンパイラはそれについて警告を発しているはずです。

次に、animateWithDuration は UIWindow メソッドではなく UIView メソッドです。UIWindow は UIView を継承しているため、コンパイラはあなたが書いたものを許可すると思いますが、そのメソッドを実装していないサブクラスにクラス メッセージを送信するのは悪い考えです。

あなたのアニメーションメソッドは読むべきです

[UIView animateWithDuration: x...

第三に、タイマーでトリガーされた Core Animation は問題なく動作するはずです。ただし、タイマーは繰り返されないのに、タイマーを使用する必要はありません。遅延が発生するアニメーション メソッドの形式を使用して、コードをよりクリーンにします。そうすれば、タイマーや別の「slideWords」メソッドはまったく必要ありません。コードは次のようになります。

 randomNumber = 1 + arc4Random()%2;

 if(randomNumber = 1){
    Redlabel.alpha = 1.0;
    RedLabel.frame = CGRectMake(0, -50, 320, 100);
    [UIWindow animateWithDuration:5.0 
      delay: 60.0
      options: 0
      animations:^{
        Redlabel.alpha = 1.0;
        Redlabel.frame = CGRectMake(0,300,320,100);
    }completion:^(BOOL finished){
        [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{
            Redlabel.alpha = 0.0;
        }completion:^(BOOL finished){
        }];
    }];
 }

 if(randomNumber = 2){
    GreenLabel.alpha = 1.0;
    GreenLabel.frame = CGRectMake(0, -50, 320, 100);
    [UIWindow animateWithDuration:5.0 
      delay: 60.0
      options: 0
      animations:^{
        GreenLabel.alpha = 1.0;
        GreenLabel.frame = CGRectMake(0,300,320,100);
    }completion:^(BOOL finished){
        [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{
            GreenLabel.alpha = 0.0;
        }completion:^(BOOL finished){
        }];
    }];
 }

4 番目: Cocoa には、従うべき強力な命名規則があります。メソッド名と変数名は小文字で始め、名前内の各単語は大文字にする必要があります。クラス名のみ大文字にする必要があります。(Apple の Core Foundation 関数は異なる命名規則に従いますが、それらはメソッドではなく、C 関数です...)

したがって、「RedLabel」は「redLabel」であり、「GreenLabel」は「greenLabel」である必要があります

于 2012-06-12T16:22:26.437 に答える