Search code examples
macosswiftcore-animation

CABasicAnimation too verbose


In my application I have several fades. I create them with Core Animation, using syntax similar to what is below. Is there a less verbose syntax I could use?

  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()

Solution

  • Sure. You can make your own:

    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) {
        // ...
    }