Core Animation, безусловно, может это сделать для вас. Вы должны создать CALayer
подкласс, который имеет новое свойство, вы хотите анимировать:
class CustomLayer: CALayer {
@NSManaged var colorPercentage: Float
override required init(layer: AnyObject) {
super.init(layer: layer)
if let layer = layer as? CustomLayer {
colorPercentage = layer.colorPercentage
} else {
colorPercentage = 0.0
}
}
required init?(coder decoder: NSCoder) {
super.init(coder: decoder)
}
override class func needsDisplay(forKey key: String) -> Bool {
var needsDisplay = super.needsDisplay(forKey: key)
if key == "colorPercentage" {
needsDisplay = true
}
return needsDisplay
}
override func action(forKey key: String) -> CAAction? {
var action = super.action(forKey: key)
if key == "colorPercentage" {
action = super.action(forKey: "opacity") // Create reference action from an existing CALayer key
if let action = action as? CABasicAnimation {
action.keyPath = key
action.fromValue = value(forKeyPath: key)
}
}
return action
}
override func display() {
guard let presentationLayer = presentation() else { return }
print("Current 'colorPercentage' value: \(presentationLayer.colorPercentage)")
// Called for every frame of an animation involving "colorPercentage"
}
}
(В Swift, @NSManaged
это хак необходимо для Core Animation для лечения colorPercentage
как @dynamic
собственности Objective-C.)
Следуя этому шаблону, вы можете создать собственный слой, который содержит ваши собственные анимационные свойства. display()
будет вызываться для каждого кадра анимации на главном потоке, так что вы можете реагировать на изменения стоимости с течением времени, однако вы хотите:
let animation = CABasicAnimation(keyPath: "colorPercentage")
animation.duration = 1.0
animation.fromValue = customLayer.colorPercentage
customLayer.colorPercentage = 1.0
customLayer.add(animation, forKey: "colorPercentageAnimation")
В качестве бонуса, action(forKey:)
может быть использован для создания действия с «эталонная анимация», о которой знает Core Animation и настраивает ее для работы с вашим настраиваемым свойством. При этом, можно вызвать CALayer
анимации внутри UIKit стиль анимации затворов, которые гораздо более удобны в использовании:
UIView.animate(withDuration: 1.0, animations: {
customLayer.colorPercentage = 1.0
})
Это было бы наиболее полезным для ** мониторинга ** значение представления существующего анимируемого имущества, как непрозрачность некоторого вида, реагировать на визуальные изменения этого значения. Но для пользовательских свойств лучше сделать подкласс 'CALayer', который определяет такие настраиваемые свойства, как animatable. – LucasTizma