UIView.animateKeyFramesWithDuration没有动画制作动画

时间:2016-06-24 21:37:05

标签: swift uikit uiviewanimation

我正在尝试写一个闪烁的动画,但它的时间感觉不合适。我在操场上做了一个简单的版本:

import UIKit
import XCPlayground
let v = UIView()
v.frame.size = CGSize(width: 200, height: 200)
v.backgroundColor = UIColor.redColor()
v.layer.cornerRadius = 100

UIView.animateKeyframesWithDuration(1, delay: 0, options: .Repeat, animations: {
    UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 0.5, animations: {
      v.alpha = 0.0
    })
    UIView.addKeyframeWithRelativeStartTime(0.5, relativeDuration: 0.5, animations: {
      v.alpha = 0.5
    })
    }, completion: nil)

XCPlaygroundPage.currentPage.liveView = v

视图从0渐变为0.5,然后在恢复动画之前看起来在完整的alpha值下停顿一秒钟。我在模拟器中注意到了同样的事情。

关于关键帧应该如何工作,我有什么遗漏吗?

1 个答案:

答案 0 :(得分:2)

经过检查,我认为v视图alpha的默认设置为1.0。这意味着在动画结束一瞬间后,它再次处于完全alpha,然后重复动画。为了弥补这一点并获得您想要的效果,您可以考虑在运行alpha之前将0.0设置为XCPlaygroundPage.currentPage.liveView = v

<强>更新

您可以将代码的动画分解为4种状态。

  1. 一开始,alpha1.0
  2. 第一个关键帧会在0.5秒内将alpha更改为0.0
  3. 第二个关键帧会在0.5秒内将alpha更改为0.5
  4. 此时,动画已结束。因此,v视图会恢复为状态 1 并重复播放动画。
  5. 状态 4 是完整alpha闪烁的地方,因为v视图在{{1}中从0.5转到1.0秒但是,计算机无法在0.0秒内发生任何事情(由于复杂的物理原因,实际上不可能),因此当计算机试图接近{{{{}}时,结果是完全0.0的瞬间闪烁。 1}}秒尽可能。

    为了避免这种情况,您可以将原始alpha设置为0.0,这样动画的状态 1 将与其状态的结果相同3 ,或者您可以在动画结束前添加另一个将alpha带回0.5的关键帧:

    示例:

    选项1:

    alpha

    选项2:

    0.0