2012-06-12 154 views
0

我想要做的是在计时器滴答时动画标签。 我有一个基于窗口的应用程序。核心动画和NSTimer

  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){ 
     }]; 
    }]; 
} 

}

+0

没有读完整个事情,但你的条件只是做作业。两者都将被评估为true,并改变randomNumber。另外,alpha级别被赋值为1,然后被赋值为1(no-op)。 – danh

+0

当我只写在RedLabel.alpha .....休息的行;程序工作正常。问题应该由NSTimer或循环触发,所以我正在寻找替代品。 –

+0

此外,您将两个标签的框架设置为相同的矩形,然后对同一矩形设置动画。一个将永远隐藏。我认为你应该重新开始并从根本上简化:没有循环或计时器,没有随机的。只需让一个标签消失并移动你想要的方式(可能会添加一个临时按钮来触发它)。然后做第二个标签。然后硬编码你想要的两个随机情况,然后添加随机...等等。你会到达那里! – danh

回答

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中有一个强大的命名约定,你应该遵循。方法名称和变量名称应以小写字母开头,名称中的每个单词都应该大写。只有类名应该大写。 (苹果的核心基础功能遵循不同的命名规则,但那些不是方法,它们是C函数...)

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

+0

这一次,UIView有问题。 [window setHidden:YES]; [newGameView setHidden:NO]; 我得到的只是一个空白的屏幕。我知道我缺乏客观的编码c。不管怎样,谢谢你。 –

+0

我不认为你应该设置窗口隐藏:是的。这会隐藏一切,并给你一个黑屏。在iOS上,一个窗口负责整个屏幕,并托管当前视图控制器的内容视图。 –