使用属性键路径为 SCNCamera.fStop 设置动画不起作用,仅在隐式 SCNTransaction 内
Posted
技术标签:
【中文标题】使用属性键路径为 SCNCamera.fStop 设置动画不起作用,仅在隐式 SCNTransaction 内【英文标题】:Animating SCNCamera.fStop with property key path doesn't work, only inside implicit 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
,焦距不会再次跳转到初始值。这是记录在案的行为吗?
【参考方案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
的事实是否已记录?以上是关于使用属性键路径为 SCNCamera.fStop 设置动画不起作用,仅在隐式 SCNTransaction 内的主要内容,如果未能解决你的问题,请参考以下文章