[swift]UIView.animateKeyFramesWithDuration 不顺利动画

标签: Swift
发布时间: 2017/3/6 22:52:58
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想写一个闪烁的动画,但它的时间的感觉了。我在操场上做了一个简单的版本︰

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,然后似乎恢复动画前一秒钟在充分 α 口吃。我注意到在模拟器中同样的事情。

有什么我错过关于关键帧是怎么工作?

解决方法 1:

经检查,我相信的默认值为您 v 视图的 alpha1.0 。这意味着,您的动画播放后一瞬间结束它是全速 alpha 再一次,然后重复该动画。要弥补这并获得你想要的效果,您可能会考虑设置其 alpha0.0 然后才可以运行 XCPlaygroundPage.currentPage.liveView = v

更新︰

你可以把动画代码分成 4 个国家。

  1. 开始时, alpha1.0
  2. 第一个关键帧改变 alpha0.0 以 0.5 秒为单位。
  3. 第二个关键帧更改 alpha0.5 以 0.5 秒为单位。
  4. 在这一点上,动画已经结束。所以 v 视图将恢复为状态1 ,然后重复动画。

国家4是在哪里全眨眼 alpha 发生因为 v 视图会从 0.51.00.0 秒。然而,计算机不能让任何事情发生在 0.0 秒 (实际上无法由于复杂的物理符号),所以结果就是一瞬间的全 flash alpha 作为计算机试图尽可能接近 0.0 秒因为它可以。

若要绕过这个你可以要么设置原始 alpha0.5 所以这样的动画状态1将同样作为其状态3,结果或您可以添加带来的另一个关键帧 alpha0.0 动画之前︰

例子︰

选项 1:

//Import Statements
//Configuration and Initialization of v view

v.alpha = 0.5 //<--- This is the key point

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

选项 2:

//Import Statements
//Configuration and Initialization of v view
v.alpha = 0.0 //<-- Make sure to set the original alpha to 0.0

let duration: NSTimeInterval = 1.8
let third: NSTimeInterval = 1/3

UIView.animateKeyframesWithDuration(duration, delay: 0, options: .Repeat, animations: {
   UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: third, animations: {
      v.alpha = 0.0
   })
   UIView.addKeyframeWithRelativeStartTime(third, relativeDuration: third, animations: {
      v.alpha = 0.5
   })
   //Key Point Below. Added Another Frame!
   UIView.addKeyframeWithRelativeStartTime(third*2, relativeDuration: third, animations: {
      v.alpha = 0.0
   })
}, completion: nil)

XCPlaygroundPage.currentPage.liveView = v
赞助商