Core Animation kann dies sicherlich für Sie tun. Sie benötigen einen CALayer
Unterklasse erstellen, die eine neue Eigenschaft hat würden Sie animieren möchten:
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"
}
}
(In Swift, @NSManaged
ist ein Hack zur Zeit notwendig für Core Animation colorPercentage
als Objective-C @dynamic
Eigentum zu behandeln.)
Nach diesem Muster können Sie eine benutzerdefinierte Ebene erstellen, die Ihre eigenen animierbaren Eigenschaften enthält. display()
wird für jeden Frame der Animation auf dem Haupt-Thread aufgerufen werden, so können Sie Wertänderungen im Laufe der Zeit reagieren aber Sie mögen:
let animation = CABasicAnimation(keyPath: "colorPercentage")
animation.duration = 1.0
animation.fromValue = customLayer.colorPercentage
customLayer.colorPercentage = 1.0
customLayer.add(animation, forKey: "colorPercentageAnimation")
Als Bonus kann action(forKey:)
verwendet werden, eine Aktion aus zu erstellen eine "Referenzanimation", die Core Animation kennt und konfiguriert, um mit Ihrer benutzerdefinierten Eigenschaft zu arbeiten. Damit ist es möglich, CALayer
Animationen innerhalb UIKit-Stil Animation Schließungen aufrufen, die viel bequemer zu bedienen sind:
UIView.animate(withDuration: 1.0, animations: {
customLayer.colorPercentage = 1.0
})
Diese nützlichsten wäre für ** ** Überwachung der Präsentation Wert eines vorhandenen animierbaren Eigenschaft, Wie die Opazität einer Ansicht, um auf visuelle Änderungen an diesem Wert zu reagieren. Bei benutzerdefinierten Eigenschaften ist es jedoch einfacher, eine CALayer-Unterklasse zu erstellen, die solche benutzerdefinierten Eigenschaften als animierbar definiert. – LucasTizma