これまで、私はUIKitフレームワークの一部である属性に取り組んでいる限り、UIView
のアニメーションを使用しました。任意のUIView変数にアニメーションを設定できますか?
最近、いくつかのカレンダー/スケジューリングの動作を表示し、無限のスクロールをサポートするカスタムUIViewコントロールを作成しました。
var position = NSDate().mondayMorning() {
didSet {
self.setNeedsDisplay()
}
}
限りそのposition
変更、物事がうまく動作するよう:どのようなスクロール位置を制御することは、私はそのように宣言しているしているシンプルなNSDate変数です。 UIPanGestureRecognizer
でスクロールを設定することさえ簡単だった:
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
}
私は.Ended
ケースでデカールの動きを実装しようとすると、トリッキーな部分が来ます。理想的には、ある種のUIView.animationWithDuration(... .CurveEaseOut)
呪文を使いたいと思いますが、多くの試行錯誤にもかかわらず、私は何もできません。過去に私は自分のカスタムアイテムを作っていましたが、そのような場合はレイアウトが面倒だったので、アニメーションブロックをlayoutIfNeeded
にするだけですが、この場合は修正したいNSDate値を曲線に沿って移動し、その後の表示更新を駆動する。働いていた何かを見つけることができません、私は高校の物理学に頼って、私自身をした:
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()
は、これが動作します。しかし、ここでCoreAnimationを活用することができれば、私はしたいと思います。私はこれを行うことができる中間地はありますか?それとも、アニメーションの素材がすべて入っているのでしょうか?