2014-10-16 47 views
2

我有一系列想要在UILabel上执行的动画,所以我查找了iOS7中添加的UIViewKeyframeAnimations更改UILabel的文本使它在使用UIViewKeyframeAnimations时重新出现

什么,我想做一个简单的版本是:

  1. 淡出的UILabel与持续时间0.5秒
  2. 等待1秒
  3. 淡入的UILabel与新文本与持续时间0.5秒

    NSTimeInterval duration = 2; 
    [UIView animateKeyframesWithDuration:duration delay:0 options:UIViewKeyframeAnimationOptionAllowUserInteraction | UIViewAnimationOptionOverrideInheritedOptions animations:^{ 
        [UIView addKeyframeWithRelativeStartTime:0 relativeDuration:0.5/duration animations:^{ 
         self.label.alpha = 0; 
        }]; 
    
        [UIView addKeyframeWithRelativeStartTime:1.5/duration relativeDuration:0.5/duration animations:^{ 
         self.label.text = [@(arc4random_uniform(4000)) stringValue]; 
         self.label.alpha = 1; 
        }]; 
    } completion:nil]; 
    

结果是标签文本是淡出并以新的文字重新出现,然后再次消失并再次消失。

结果的视频:Animation Failure

干杯 莫滕

回答

1

幽州:“其结果是,标签文字淡出,并与新的文本重新出现,然后再次淡出和褪色再次。“。然而,我在电影中看到的是,alpha转换正如预期的那样工作,淡出并淡入。唯一的例外是你的行为是在动画开始时已经应用了文本改变,而不是在您的动画的第二个关键帧开始。

了解addKeyframeWithRelativeStartTime块内的代码在animateKeyframesWithDuration被调用后立即执行就很重要。任何动画变化(帧,阿尔法等)都会动画。同样,任何不是自动动画视图属性(如标签的文本更改)都将立即可见。

为了有助于说明这一点,请尝试在所有动画块(animateKeyframesWithDuration和addKeyframeWithRelativeStartTime)的开头处放置一条NSLog语句,并在完成块中放置一条。您会看到每个NSLog (除了完成块中的)具有完全相同的日志时间。

对于这个确切原因,下面的代码工作,因为完整的块的执行被推迟,直到第一个动画结束:

[UIView animateWithDuration:1 animations:^{ 
    self.label.alpha = 0; 
} completion:^(BOOL finished) { 
    self.label.text = [@(arc4random_uniform(4000)) stringValue]; 
    [UIView animateWithDuration:1 animations:^{ 
     self.label.alpha = 1; 
    }]; 
}]; 
+0

没关系啊,所以我的选择是1.回复到旧animateWithDuration 2.介绍一个临时'UILabel'和'UIImageView' 3.使用一些第三方承诺框架扫。选项1对长动画非常混乱。 – mbogh 2014-10-16 11:56:21

0

这里是我会做什么:而不是使用一个简单的动画这样的关键帧,我会用动画与块:

[UIView animateWithDuration:0.25 animations:^ 
{ 
    [self.label setAlpha:0.0]; 
    [self.imageview setAlpha:0.0]; 
} 
       completion: ^(BOOL completed) 
{ 

    [UIView animateWithDuration:0.25 delay:0.5 options:UIViewAnimationOptionAllowUserInteraction animations:^ 
     { 
      self.label.text = [@(arc4random_uniform(4000)) stringValue]; 
      [self.label setAlpha:1.0]; 
     } 
         completion: ^(BOOL completed) 
     { 

     } 
     ]; 
    [UIView animateWithDuration:1.0 delay:0.5 options:UIViewAnimationOptionAllowUserInteraction animations:^ 
     { 
      [self.imageview setAlpha:1.0]; 
      [self.imageview setFrame:frame]; 
     } 
         completion: ^(BOOL completed) 
     { 
      //if you need to do stuff after the animations finish, here you can do them. 
     } 
     ]; 
} 
]; 
+0

它的简化版本,真正的情况是: 淡出'UILabel'和'UIImageView' 0.25 等待0.5 淡入'UILabel'为新文本以0.25 在同一时间褪色和改造'的UIImageView '用1.0 – mbogh 2014-10-16 11:51:36

+0

你可以用类似的逻辑来构建你的目标。棘手的部分将与'UIImageView' imo。给我几分钟的时间来编码并尝试.. – aytunch 2014-10-16 11:56:39

+0

是的,但是嵌套使得阅读和验证更加困难。 – mbogh 2014-10-16 11:59:23

相关问题