Mac OS - swift - CABasicAnimation 当前值

Mac OS - swift - CABasicAnimation current value

我有一个 CABasicAnimation 移动一个 NSHostingView(它是一个滚动字幕文本)。当用户将鼠标光标移到视图上时,动画必须停止并且它可以与视图交互。

我尝试了以下方法:

方法一:
按照 Apple 文档 (https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreAnimation_guide/AdvancedAnimationTricks/AdvancedAnimationTricks.html#//apple_ref/doc/uid/TP40004514-CH8-SW14) 的建议,我尝试使用 convertTime / speed = 0.
来实现 pause/resume 方法 它有效,动画暂停和恢复,但是当动画暂停时,视图内用户点击的坐标是模型层之一而不是表示层之一。因此,如果没有动画,点击会响应用户点击的位置。

方法二:
我在 CABasicAnimation 上尝试了各种动画标志,如下所示:

let animation = CABasicAnimation(keyPath: "position");
animation.duration = 10
animation.fromValue = [0, self.frame.origin.y]
animation.toValue = [-500, self.frame.origin.y]
animation.isCumulative = true
animation.isRemovedOnCompletion = false
animation.fillMode = .forwards

不管我用什么,当动画被移除时,视图回到它的原始位置(它跳回到它的原始位置)。

方法三:
我试图通过如下读取表示层位置来保存当前动画值,然后删除:

print("before")
let currentPosition = layer.presentation()?.position
print("after")

但是这个方法从来没有returns! (即永远不会打印“之后”)。会不会是 bug 之类的?

我现在没主意了。如果有人有建议,那会很有帮助。谢谢!

访问 layer?.presentation()?.position 无效,因为 animation.fromValueanimation.toValue 应该是 CGPoint 值:

animation.fromValue = CGPoint(x: 0, y: self.frame.origin.y)
animation.toValue = CGPoint(x: -500, y: self.frame.origin.y)

那么方法三就可以了。