簡體   English   中英

沿BezierPath動畫化UIView並延遲

[英]Animate UIView along BezierPath with delay

我想為圖8動作中的UIView設置動畫。 我正在使用BezierPath在Swift中進行此操作,但我想給動畫添加延遲。

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” /“ Inifinity Loop”運動為UIView設置動畫,那就很好了。 我只需要運動加上延遲。

動畫對象具有開始時間。 將其設置為將來所需的金額。

anim.beginTime = CACurrentMediaTime() + 1.0

本示例將開始時間延遲1秒。

使用dispatch_after塊來啟動整個動畫方法可能會在短期內獲得相同的結果,但可能會限制相對於將來的開始時間調整或操縱動畫上其他計時功能的能力。 調整動畫本身的時間可使動畫對象的計時狀態保持一致。

如果您希望動畫在延遲后觸發,您可以嘗試使用以下函數觸發動畫:

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秒后觸發該塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM