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?