2016-05-03 114 views
0

在過去,我已經使用了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的東西,我想。有一箇中間地帶我可以做到這一點嗎?或者動畫是全部還是全部?

回答

相關問題