2016-06-23 81 views
0

我想動畫一個數字8運動UIView。我在Swift中使用BezierPath這樣做,但我想爲動畫添加延遲。沿着貝齊爾路徑動畫UIView延遲

let center: CGPoint = CGPoint(x: 60, y: 45) 
let cent: CGPoint = CGPoint(x: 90, y: 45) 
let radius: CGFloat = 15.0 
let start: CGFloat = CGFloat(M_PI) 
let end: CGFloat = 0.0 
let path1: UIBezierPath = UIBezierPath(arcCenter: center, radius: radius, startAngle: start, endAngle: end, clockwise: true) 
let path2: UIBezierPath = UIBezierPath(arcCenter: cent, radius: radius, startAngle: -start, endAngle: end, clockwise: false) 
let path3: UIBezierPath = UIBezierPath(arcCenter: cent, radius: radius, startAngle: end, endAngle: -start, clockwise: false) 
let path4: UIBezierPath = UIBezierPath(arcCenter: center, radius: radius, startAngle: end, endAngle: start, clockwise: true) 
let paths: UIBezierPath = UIBezierPath() 
paths.appendPath(path1) 
paths.appendPath(path2) 
paths.appendPath(path3) 
paths.appendPath(path4) 

let anim: CAKeyframeAnimation = CAKeyframeAnimation(keyPath: "position") 
anim.path = paths.CGPath 
anim.repeatCount = 2.0 
anim.duration = 3.0 

view.layer.addAnimation(anim, forKey: "animate position along path") 

圖8的工作很好,但我不知道如何添加延遲。我曾嘗試使用像animateWithDuration(delay:options:animation:completion:)這樣的方法,但這並沒有幫助。如果我離開底座,並且有一個更簡單的方法來創建「圖8」/「無邊循環」動畫中的UIView,那很好。我只需要運動加上延遲。

+0

你是如何開始沿路徑視圖的動畫? –

+0

還是'addAnimation'觸發開始?我現在在操場上做這個 –

+0

addAnimation啓動它。 –

回答

3

動畫對象有一個開始時間。以任何你想要的數量來設定未來。

anim.beginTime = CACurrentMediaTime() + 1.0 

這個例子會延遲1秒開始。

使用dispatch_after塊啓動整個動畫方法可能會在短期內達到相同的結果,但可能會阻止相對於未來開始時間調整或操作動畫上其他定時功能的能力。調整動畫本身的時間可以保持動畫對象的時序狀態一致。

+1

你似乎對此很瞭解,所以如果你能回答我的一些問題,我會非常感激。如果他在完成塊中定義動畫,它是否仍然會抑制稍後調整它的能力?你能舉一個你提到的這些抑制的例子嗎?在UI中使用'dispatch_after'通常是一個糟糕的主意?最後,我會在哪裏瞭解這種東西(短期內如何工作,但後來抑制能力)?謝謝:)(即使你不回答這些大聲笑) – Ike10

+0

不一定 - 在實踐中它可能沒有效果,或者它可能。使用dispatch_after當你需要在用戶界面上延遲的事情時不是一個壞主意,這裏的問題基本上是混合時序模型。動畫狀態的一個重要部分就是時機,所以它實際上只是一致性問題,這樣動畫對象就知道它具有自己的特性,並且可以隨着環境在執行過程中的變化而相應地進行響應/調整。我會從閱讀蘋果核心動畫指南開始,這非常有見地。 – isaac

+0

這很有道理。非常感謝您花時間回答我的問題,並且感謝您繼續學習。當我有空時,我一定會閱讀指南! :D – Ike10

1

如果你想在動畫的延遲後,觸發你可以嘗試觸發動畫這樣的功能:

func executeWithDelay(_ delay: NSTimeInterval, block: dispatch_block_t) { 
    let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))) 
    dispatch_after(delay, dispatch_get_main_queue(), block) 
} 

,並用它喜歡:

executeWithDelay(1.0) { 
    //trigger animation 
} 

上面的例子將觸發1.0秒後的塊。

+1

這會起作用,但Issac的回答使用動畫的beginTime屬性更好,因爲他概述了這個原因。 –