【问题标题】:Animate UIView along BezierPath with delay延迟沿 BezierPath 为 UIView 设置动画
【发布时间】:2016-06-23 23:47:43
【问题描述】:

我想为UIView 制作 8 字形动作的动画。我正在使用 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 设置动画,那很好。我只需要动作加上延迟。

【问题讨论】:

  • 你是如何开始围绕路径的视图动画的?
  • 还是addAnimation 触发启动?我现在正在操场上做这个
  • addAnimation 启动它。
  • 谢谢。我会在一个小项目中尝试一下

标签: ios swift animation uiview uibezierpath


【解决方案1】:

动画对象有一个开始时间。将其设置为您想要的任何数量的未来。

anim.beginTime = CACurrentMediaTime() + 1.0

此示例将延迟启动 1 秒。

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

【讨论】:

  • 您似乎对此很了解,所以如果您能回答我的一些问题,我将不胜感激。如果他在完成块中定义动画,它仍然会抑制以后调整它的能力吗?你能举一个你提到的这些抑制的例子吗?一般来说,使用dispatch_after 处理 UI 是个坏主意吗?最后,我在哪里可以了解这种东西(短期内事情会如何运作,但后来会抑制能力)?谢谢:)(即使你不回答这些哈哈)
  • 不一定 - 在实践中它可能没有效果,或者它可能。当您需要在 UI 上延迟某些内容时,使用 dispatch_after 并不是一个坏主意,这里的问题基本上是混合计时模型。动画状态的一个重要部分是时间,所以它实际上只是一个一致性问题,这样动画对象就知道它自己的特性,并且可以在执行过程中随着环境的变化做出相应的响应/调整。我会先阅读 Apple 的核心动画指南,它非常有见地。
  • 这很有意义。非常感谢您花时间回答我的问题,并特别感谢您提供一个继续学习的地方。当我有时间时,我一定会阅读指南! :D
  • @CodyWeaver 你应该看看这个解决方案,因为解释的原因它更安全。
【解决方案2】:

如果您希望动画在延迟后触发,您可以尝试在如下函数中触发动画:

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秒后触发阻塞。

【讨论】:

  • 这会起作用,但 Issac 使用动画的 beginTime 属性的答案更好,因为他概述的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多