在過去,我已經使用了UIView
動畫,只要我正在處理已經屬於UIKit框架的屬性。我可以在任意UIView變量上設置動畫嗎?
最近,我創建了一個自定義UIView控件,顯示一些日曆/日程安排行爲並支持無限滾動。什麼控制滾動的立場是,有我宣佈爲這樣一個簡單的NSDate變量:
var position = NSDate().mondayMorning() {
didSet {
self.setNeedsDisplay()
}
}
只要是position
變化,事情只是工作。
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
情況貼花運動:它甚至簡單的設置了一個UIPanGestureRecognizer
滾動。理想情況下,我想要某種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()
This works。但是,如果可以在這裏利用CoreAnimation的東西,我想。有一箇中間地帶我可以做到這一點嗎?或者動畫是全部還是全部?