【发布时间】:2016-11-24 23:36:09
【问题描述】:
我正在尝试通过覆盖 CALayer 来实现“隐式动画”。我已经阅读了文档,发现它相当复杂。此外,我找不到任何像样的代码示例,也找不到很好地解释它或使用任何 Swift 的互联网帖子。
我已经通过子类BandBaseCG 实现,它试图为属性param1 提供隐式动画,并覆盖needsDisplay(forKey:),它在我的属性中调用一次,我返回true。
但这就是问题所在。我的理解是我必须返回一个符合CAAction 协议的对象,比如CABasicAnimation,这就是我所做的。但是,action(forKey:) 或 defaultAction(forKey:) 不会被 param1 键调用。
所以我知道在某些时候我可以在draw(in ctx:) 中提供Core-Graphics 绘图代码来实现实际的隐式动画以响应一些layer.param1 = 2。但我无法做到这一点,因为 API 根本没有按我的预期工作。
这是我当前的实现:
import Foundation
import QuartzCore
class BandBaseCG: CALayer {
@NSManaged var param1: Float
override init(layer: Any) {
super.init(layer: layer)
}
override init() {
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func action(forKey event: String) -> CAAction? {
print(event)
if event == "param1" {
let ba = CABasicAnimation(keyPath: event)
ba.duration = 2
ba.fromValue = (presentation()! as BandBaseCG).param1
ba.toValue = 2
return ba
}
return super.action(forKey: event)
}
override func draw(in ctx: CGContext) {
print("draw")
}
override class func defaultAction(forKey event: String) -> CAAction? {
if event == "param1" {
let ba = CABasicAnimation(keyPath: event)
ba.duration = 2
ba.fromValue = 0
ba.toValue = 2
return ba
}
return super.defaultAction(forKey: event)
}
override class func needsDisplay(forKey key: String) -> Bool {
print(key)
if key == "param1" {
return true
}
return super.needsDisplay(forKey: key)
}
override func display() {
print("param value: \(param1)")
}
}
【问题讨论】:
标签: swift core-animation calayer