【问题标题】:Animating SCNCamera.fStop with property key path doesn't work, only inside implicit SCNTransaction使用属性键路径为 SCNCamera.fStop 设置动画不起作用,仅在隐式 SCNTransaction 内
【发布时间】:2021-05-12 03:04:48
【问题描述】:

奇怪的是,这段代码没有为 fStop 设置动画:

cameraNode.camera!.wantsDepthOfField = true
cameraNode.camera!.focusDistance = 2

let animation = CABasicAnimation(keyPath: "fStop")
animation.toValue = 0.5
animation.duration = 0.3
cameraNode.camera!.addAnimation(animation, forKey: nil)

虽然这个是:

SCNTransaction.begin()
SCNTransaction.animationDuration = 0.3
cameraNode.camera!.fStop = 0.5
SCNTransaction.commit()

为什么?

【问题讨论】:

  • 两者都对我有用,但 CABasicAnimation 在完成时会被删除。
  • 感谢您的帮助。这是否意味着删除动画有一些副作用,可以确定为什么它对我不起作用?我没有在其他任何地方使用或存储动画。
  • 你确定它没有工作,而不是发生得太快你没有注意到吗?尝试增加持续时间。
  • 你是对的,持续时间较长我可以看到它可以工作,但是一旦动画完成,焦距就会重置为动画之前的值(或者至少看起来是这样的)。在动画结束后使用SCNTransaction,焦距不会再次跳转到初始值。这是记录在案的行为吗?

标签: ios macos scenekit


【解决方案1】:

动画在完成时被移除,因此 fStop 被重置为其初始值。您只需要在启动动画时为其设置最终值即可。

let animation = CABasicAnimation(keyPath: "fStop")
animation.fromValue = cameraNode.camera!.fStop
animation.toValue = 0.5
animation.duration = 0.3
cameraNode.camera!.addAnimation(animation, forKey: nil)
cameraNode.camera!.fStop = 0.5

【讨论】:

  • 谢谢,这行得通。动画仅在某处记录了一个临时值这一事实吗?
  • 这是标准行为,CAAnimation 的 isRemovedOnCompletion 默认为 true。动画只影响node.presentation,所以当动画被移除时,现有节点会显示其初始值。
  • CAAnimation 仅影响node.presentation 的事实是否已记录?
猜你喜欢
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2014-04-19
  • 2021-11-05
  • 1970-01-01
  • 2021-01-14
相关资源
最近更新 更多