CABasicAnimation太冗长了

时间:2015-07-17 06:31:54

标签: macos swift core-animation

在我的应用程序中,我有几个淡入淡出。我使用Core Animation创建它们,使用类似于下面的语法。我可以使用更简洁的语法吗?

  CATransaction.begin()
  let fade = CABasicAnimation(keyPath: "opacity")
  fade.fromValue = 0
  fade.toValue = 1
  fade.duration = 0.35
  fade.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
  fade.fillMode = kCAFillModeForwards
  fade.removedOnCompletion = false

  CATransaction.setCompletionBlock({
      ...
  })

  self.addAnimation(fade, forKey: nil)
  CATransaction.commit()

2 个答案:

答案 0 :(得分:2)

不确定。你可以自己做:

extension CABasicAnimation
{
    convenience init(_ keyPath: String, from: AnyObject?, to: AnyObject?, duration: CFTimeInterval = 0.3)
    {
        self.init(keyPath: keyPath)
        fromValue = from
        toValue = to
        self.duration = duration
    }
}

extension CALayer
{
    func addAnimation(animation: CAAnimation, forKey key: String?, completion: Void -> Void)
    {
        CATransaction.begin()
        CATransaction.setCompletionBlock(completion)
        addAnimation(animation, forKey: key)
        CATransaction.commit()
    }
}

// later...

let fade = CABasicAnimation("opacity", from: 0, to: 1, duration: 0.35)
self.addAnimation(fade, forKey: nil) {
    // ...
}

答案 1 :(得分:1)

作为@ jtbandes'的替代品很好的答案(投票),在很多情况下你可以使用更简单的UIView动画:

UIView.animateWidhDuration(.35
animations:
{
  myView.alpha = 0
}
completion:
{
  (finshed) in
  //your completion code here
})

编辑:

我从你的评论中看到你正在为OS X开发。这需要一种不同的技术,为你的视图使用动画代理:

myView.animator.setAlphaValue(0.0)

如果您希望它使用与默认0.25秒持续时间不同的持续时间,则需要在动画上下文组中设置它:

NSAnimationContext.currentContext().beginGrouping()
NSAnimationContext.currentContext().setDuration(0.35)
myView.animator.setAlphaValue(0.0)
NSAnimationContext.currentContext().endGrouping()

我认为,与iOS不同,NSView没有本机alpha设置,而setAlphaValue实际上操纵了视图的图层的alpha值。在这种情况下,您可能需要将视图设置为图层备份。