ios - 更改 UILabel 的文本使其在使用 UIViewKeyframeAnimations 时重新出现

标签 ios uiview uiviewanimation

我想在 UILabel 上执行一系列动画,所以我查找了在 iOS7 中添加的 UIViewKeyframeAnimations

我想做的简化版本是:

  1. 淡出 UILabel,持续时间为 0.5 秒
  2. 等一秒
  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

干杯 莫腾

最佳答案

您声明:“结果是标签文本淡出并重新出现新文本,然后再次淡出并再次淡入。”。然而,我在电影中看到的是,alpha 过渡按预期工作,淡出和淡入。您期望的行为的唯一异常(exception)是,文本更改在动画开始时就已经应用,而不是在动画第二个关键帧的开始。

重要的是要了解 addKeyframeWithRelativeStartTime block 中的代码会在调用 animateKeyframesWithDuration 后立即执行。任何可动画的变化(帧、alpha 等)都将被动画化。同样,任何不是自动动画 View 属性的内容(例如标签的文本更改)都将立即可见。

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

正是出于这个原因,下面的代码起作用,因为完整 block 的执行被推迟到第一个动画完成时:

[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;
    }];
}];

关于ios - 更改 UILabel 的文本使其在使用 UIViewKeyframeAnimations 时重新出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26402062/

相关文章:

ios - 以编程方式剖析 iOS 协议(protocol),然后调用这些方法?

swift - UIView alpha 在第一次调用更改后不会更新。 ( swift 4.2)

iphone - 动画期间不能触摸( block 动画)

ios - CATransaction 设置动画持续时间不起作用

ios - 不推荐使用UItableViewCell setTextColor

objective-c - 用它的所有 subview 给 UIView 着色

iphone - 状态栏下的 UIView

iOS cancel (void)——执行并关闭ViewController

ios - NSLayoutConstraint,从原点更改常量动画,不是我设置的

ios - 如何在 swift 中将子类 NSManagedObject 分配给 var (而不是常量)