objective-c:计时器结束前的动画按钮

时间:2012-04-26 13:31:06

标签: iphone objective-c ios

我正在开发一款非常简单的iPhone游戏,其中包括根据随机语音提示连续多次选择正确的彩色按钮。我设置它,如果按钮是一种颜色并被点击,它总是每次都变为硬编码颜色(例如,如果你点击红色,它总是变成蓝色)。颜色变化方法在IBOutlet中设置。我在while循环中设置了一个计时器,当计时器结束时,它检查玩家是否做出了正确的选择。问题是在计时器用完之后才会发生按钮颜色更改,这会导致用于检查正确答案的方法出现问题。有没有办法让这种颜色变化立即发生?从我搜索到的内容来看,我知道它与故事板动作有关,直到代码执行之后才会发生,但我没有发现使用计时器的任何事情。以下是在答案正确时调用计时器的方法部分:

BOOL rightChoice = true;
int colorNum;
NSDate *startTime;
NSTimeInterval elapsed;
colorNum = [self randomizeNum:middle];
[self setTextLabel:colorNum];
while (rightChoice){
    elapsed = 0.0;
    startTime = [NSDate date];
    while (elapsed < 2.0){
        elapsed = [startTime timeIntervalSinceNow] * -1.0;
        NSLog(@"elapsed time%f", elapsed);
    }
    rightChoice = [self correctChoice:middleStatus :colorNum];
    colorNum = [self randomizeNum:middle];
}

1 个答案:

答案 0 :(得分:2)

两件事之一脱颖而出

  • 您使用while循环作为计时器,不要这样做 - 操作是同步的。
  • 如果在主线程上运行,并且您的代码未返回,则您的UI将更新。口头禅说:“当你没有回来时,你就会阻挡。”
  • Cocoa有NSTimer异步运行 - 这里很理想。

所以让我们get to grips with NSTimer(或者你可以使用GCD并将队列保存到ivar,但NSTimer似乎是正确的方法)。

制作名为timer _的ivar:

// Top of the .m file or in the .h
@interface ViewController () {
  NSTimer *timer_;
}
@end

制作一些启动和停止功能。你怎么称呼这些取决于你。

- (void)startTimer {
  // If there's an existing timer, let's cancel it
  if (timer_)
    [timer_ invalidate];

  // Start the timer
  timer_ = [NSTimer scheduledTimerWithTimeInterval:5.0
                                            target:self
                                          selector:@selector(onTimerFinish:)
                                          userInfo:nil
                                           repeats:NO];
}

- (void)onTimerFinish:(id)sender {
  NSLog(@"Timer finished!");

  // Clean up the timer
  [timer_ invalidate];
  timer_ = nil;
}

- (void)stopTimer {
  if (!timer_)
    return;

  // Clean up the timer
  [timer_ invalidate];
  timer_ = nil;
}

现在

  • 将您的计时器测试代码放入onTimerFinish函数中。
  • 制作一个存储当前选择的ivar。在做出选择时更新此ivar并对UI进行相关更改。如果满足停止条件,请调用stopTimer。
  • 在onTimerFinished中,如果您愿意,可以有条件地再次调用和startTimer。

希望这有帮助!