2016-05-03 6 views
0

In der Vergangenheit habe ich die UIView Animationsdateien gut verwendet, solange ich an Attributen arbeite, die bereits Teil der UIKit-Frameworks sind.Kann ich eine Animation für eine beliebige UIView-Variable einrichten?

In letzter Zeit habe ich ein benutzerdefiniertes UIView-Steuerelement erstellt, das ein bestimmtes Kalender-/Zeitplanungsverhalten anzeigt und unbegrenztes Scrollen unterstützt. Was die Bildlaufposition steuert, ist eine einfache NSDate Variable, die ich habe haben als solche deklariert:

var position = NSDate().mondayMorning() { 
    didSet { 
     self.setNeedsDisplay() 
    } 
} 

Solange das position Änderungen, die Dinge einfach funktionieren. Es war auch einfach das Scrollen mit einem UIPanGestureRecognizer einzurichten:

struct StartState { static var position:NSDate = NSDate() } 
switch pan.state { 
case .Began: 
    StartState.position = self.position 
case .Changed: 
    let translation = pan.translationInView(self).y 
    self.position = StartState.position - ((7 * 24).hours/self.cellWidth * translation) 
case .Cancelled: 
    self.position = StartState.position 
default: 
    break 
} 

Der schwierige Teil kommt, wenn ich versuche, ein Abziehbild Bewegung am .Ended Fall zu implementieren. Im Idealfall möchte ich eine Art von UIView.animationWithDuration(... .CurveEaseOut) Beschwörung, aber trotz viel Versuch und Irrtum, habe ich nichts zu arbeiten. In der Vergangenheit war ich in der Lage, meine eigenen Sachen wie diese zu machen, aber in diesen Fällen war ich mit dem Layout beschäftigt, also würde ich meinen Animationsblock einfach zu einem layoutIfNeeded machen, aber in diesem Fall möchte ich das ändern NSDate Wert entlang einer Kurve und fahren die nachfolgenden Display-Updates. Nicht in der Lage, etwas zu finden, das funktioniert, ich griff nur auf High-School-Physik und habe meine eigene:

case .Ended: 
    let translation = pan.translationInView(self).y 
    let v = pan.velocityInView(self).y 
    let a:CGFloat = -4000.0 // 4 pixels/millisecond, recommended on gavedev 
    let travelTime = (v/a).abs.seconds 
    let started = NSDate() 
    let timer = Timer() 
    timer.interval = 40.milliseconds 
    timer.tick = { 
     let elapsed = NSDate() - started 
     if elapsed >= travelTime { 
      timer.stop() 
     } 
     else { 
      let decelDisplacement = (v.abs * CGFloat(elapsed.seconds.magnitude) + (a * 0.5 * CGFloat(elapsed.seconds.magnitude.squared))) * v.sign 
      self.position = StartState.position - ((7 * 24).hours/self.cellWidth * (translation + decelDisplacement)) 
     } 
    } 
    timer.start() 

Dies funktioniert. Aber wenn es möglich wäre, das CoreAnimation-Zeug hier zu nutzen, würde ich gerne. Gibt es einen Mittelweg, wo ich das machen kann? Oder ist das Animationsmaterial alles in allem?

Antwort