延迟沿着 BezierPath 动画 UIView
Animate UIView along BezierPath with delay
我想制作一个 UIView
8 字形动作的动画。我在 Swift 中使用 BezierPath
执行此操作,但我想为动画添加延迟。
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:)
之类的方法,但这没有帮助。如果我离基地很远,并且有一种更简单的方法可以在 'Figure 8'/'Inifinity Loop' 运动中为 UIView
设置动画,那会很好。我只需要动作加上延迟。
如果您希望动画在延迟后触发,您可以尝试在这样的函数中触发动画:
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秒后触发区块
动画对象有开始时间。将其设置为您想要的任何数量的未来。
anim.beginTime = CACurrentMediaTime() + 1.0
这个例子会延迟1秒开始。
使用 dispatch_after
块启动整个动画方法可能会在短 运行 中实现相同的结果,但可能会抑制调整或操纵动画相关的其他计时功能的能力到未来的开始时间。调整动画本身的时间可以使动画对象的计时状态保持一致。
我想制作一个 UIView
8 字形动作的动画。我在 Swift 中使用 BezierPath
执行此操作,但我想为动画添加延迟。
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:)
之类的方法,但这没有帮助。如果我离基地很远,并且有一种更简单的方法可以在 'Figure 8'/'Inifinity Loop' 运动中为 UIView
设置动画,那会很好。我只需要动作加上延迟。
如果您希望动画在延迟后触发,您可以尝试在这样的函数中触发动画:
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秒后触发区块
动画对象有开始时间。将其设置为您想要的任何数量的未来。
anim.beginTime = CACurrentMediaTime() + 1.0
这个例子会延迟1秒开始。
使用 dispatch_after
块启动整个动画方法可能会在短 运行 中实现相同的结果,但可能会抑制调整或操纵动画相关的其他计时功能的能力到未来的开始时间。调整动画本身的时间可以使动画对象的计时状态保持一致。