0

我想为我的 UILabel 设置动画,使其看起来像向上计数。为了争论,我只想说我希望它每秒增加 1。

以下方法均未正常工作。

一个简单的 for 循环(此处的示例)不起作用,因为它的速度太快了。

for(int i =0;i<1000;i++)
{
 lblNum.text = [NSString stringWithFormat:@"%d",i]; 
}

添加 sleep(1) 不起作用,因为执行是异步的(我认为这至少是为什么)

我也试过:

  for(int i=0;i<1000;i++)
    {
        [self performSelector:@selector(updateLbl:)
                   withObject:[NSNumber numberWithInt:i ] afterDelay:1];
}
-(void)updateLbl:(NSNumber *)num
{
    lblNum.text = [NSString stringWithFormat:@"%@",num];

}

也:

 for(int i=0;i<1000;i++)
        {
 dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
            // Do something...
            sleep(1);

            dispatch_async(dispatch_get_main_queue(), ^{
                lblNum.text = [NSString stringWithFormat:@"%d",i];

            });
        });
}
4

3 回答 3

1
NSTimer *timer = [NSTimer scheduleTimerWithTimeInterval:1.0 target:self selector:@selector(increment:) userInfo:label repeats:YES];

...

- (void)increment:(NSTimer *)timer {
  UILabel *label = (UILabel *)timer.userInfo;
  NSInteger i = label.text.integerValue;
  i++;
  label.text = [NSString stringWithFormat:@"%d", i];
  if(someCondition){
    [timer invalidate]//stops calling this method
  }
}
于 2013-09-03T04:11:16.367 回答
0

我认为这样做的一个好方法是使用 NSTimer。

如何使用 NSTimer?

实现很简单,只需将 repeat 设置为 YES 并让计时器每秒触发一次。您可以有一个变量来跟踪计数并每次增加它。

一个好的编程经验法则:永远不要使用睡眠!

于 2013-09-03T04:09:23.877 回答
0

使用NSTimer&NSRunLoop在代码中执行动画

 timer_=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(labelAnimation:) userInfo:nil repeats:NO];

    [[NSRunLoop currentRunLoop] addTimer:timer_ forMode:NSDefaultRunLoopMode];

- (void)increment:(NSTimer *)timer 
{
 if(isAnimationComplete)
   {
      [timer_ invalidate]//stops calling this method
   }
 else
   {
      //perform your action
   }
}
于 2013-09-03T04:25:57.703 回答