2016-08-09 176 views
0

Ich möchte Core Animation oder sogar UIDynamics verwenden, um animierte Werte (Floats) zu generieren, mit denen ich andere Parameter steuern kann.Erzeugen interpolierter Werte mit Hilfe einer Animation

z. Wenn ich eine Animation mit einer Leichtigkeit habe, möchte ich eine Farbe mit einem "erleichterten" Wert steuern.

Antwort

0

Meine beste Schätzung ist zu verwenden. Siehe hierzu post. Änderungen einer Animation sind von KVO nicht beobachtbar.

+1

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

1

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