Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Swift 4 KeyPath in CAShapeLayer animation

Tags:

ios

swift

swift4

If I write Swift 3 code it would look like this:

let animation = CABasicAnimation(keyPath: #keyPath(CAShapeLayer.path))

But I tried to use Swift 4 new syntax for keyPath and I got:

let keyPath = \CAShapeLayer.path
let animation = CABasicAnimation(keyPath: keyPath) // error line

> Error: Cannot convert value of type 'ReferenceWritableKeyPath' to expected argument type 'String?'

How can I use key path in this situation with swift 4?

like image 997
wm.p1us Avatar asked Aug 08 '17 09:08

wm.p1us


2 Answers

As for now CABasicAnimation still uses the old String keyPaths so you should still use #keyPath(CAShapeLayer.path) even though you are using Swift 4.

Apple will probably update all it's APIs in the future to make use of these safer key path references. But for now you are stuck with "unsafe" Strings.

like image 108
Damiaan Dufaux Avatar answered Nov 20 '22 00:11

Damiaan Dufaux


Yes, it is possible to use swift keypaths. Like:

extension UIView {

func animateLayer<Value>(_ keyPath: WritableKeyPath<CALayer, Value>, to value:Value, duration: CFTimeInterval) {

    let keyString = NSExpression(forKeyPath: keyPath).keyPath
    let animation = CABasicAnimation(keyPath: keyString)
    animation.fromValue = self.layer[keyPath: keyPath]
    animation.toValue = value
    animation.duration = duration
    self.layer.add(animation, forKey: animation.keyPath)
    var thelayer = layer
    thelayer[keyPath: keyPath] = value
}
}

Usage like:

animateLayer(\.shadowOffset, to: CGSize(width: 3, height: 3), duration:1)
animateLayer(\.shadowOpacity, to: 0.4, duration: 1)

It's not thoroughly tested. but worked for me.

like image 1
heiko Avatar answered Nov 20 '22 01:11

heiko