2016-08-09 2 views
0

Я хотел бы (ab-) использовать Core Animation или даже UIDynamics для создания анимированных значений (float), которые я мог бы использовать для управления другими параметрами.Генерация интерполированных значений с использованием анимации

E.g. Имея анимацию с легкостью, я хотел бы управлять цветом с «ослабленным» значением.

ответ

0

Мое лучшее предположение - использовать CADisplayLink. См. Это post. Изменения анимации не наблюдаются KVO.

+1

Это было бы наиболее полезным для ** мониторинга ** значение представления существующего анимируемого имущества, как непрозрачность некоторого вида, реагировать на визуальные изменения этого значения. Но для пользовательских свойств лучше сделать подкласс 'CALayer', который определяет такие настраиваемые свойства, как animatable. – LucasTizma

1

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    
}) 
Смежные вопросы