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 是 UIView 方法,而不是 UIWindow 方法。我猜编译器允许您编写的内容,因为 UIWindow 继承自 UIView,但是向未实现该方法的子类发送类消息是一个坏主意。

您的动画方法应阅读

[UIView animateWithDuration: x...

第三,使用计时器触发的核心动画应该可以正常工作。但是,既然您的计时器不重复,为什么还要使用计时器呢?使用带延迟的动画方法的形式,让你的代码更干净。那么您根本不需要计时器或单独的“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){
        }];
    }];
 }

第四:您应该遵循 Cocoa 中的强命名约定。方法名称和变量名称应以小写字母开头,名称中的每个单词都应大写。只有类名应该大写。(Apple 的 Core Foundation 函数遵循不同的命名规则,但那些不是方法,它们是 C 函数......)

所以你的“RedLabel”应该是“redLabel”,“GreenLabel”应该是“greenLabel”

于 2012-06-12T16:22:26.437 回答