沿着BezierPath延迟动画UIView

时间:2016-06-23 23:47:43

标签: ios swift animation uiview uibezierpath

我想在图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”/“无限循环”运动中设置UIView的动画效果。我只需要运动加上延迟。

2 个答案:

答案 0 :(得分:4)

动画对象有一个开始时间。根据您的需要将其设置为未来。

anim.beginTime = CACurrentMediaTime() + 1.0

此示例将启动延迟1秒。

使用dispatch_after块启动整个动画方法可能会在短期内获得相同的结果,但可能会抑制相对于动画调整或操纵动画上的其他计时功能的能力未来的开始时间。调整动画本身的时间可以使动画对象的计时状态保持一致。

答案 1 :(得分: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秒后触发阻止。