NSView Frame Origin 在动画完成后重置(Animator 代理)

NSView Frame Origin Get Reset After Animation Completed (Animator Proxy)

动画代理setFrameOrigin在动画完成后使视图闪回原点。我使用下面的代码为 NSView 设置动画以向下移动 -50 点,但是,当动画完成时,帧位置似乎重置为 0 并导致视图闪烁.

我为此视图设置了自动布局约束,我认为此位置重置可能是由自动布局引起的。

  NSAnimationContext.beginGrouping()
  NSAnimationContext.current.duration = 0.5
  barVersionFree.animator().setFrameOrigin(NSPoint(x: 0, y: -50))
  NSAnimationContext.endGrouping()

我尝试使用下面的代码再次设置它,但结果是一样的。

  NSAnimationContext.beginGrouping()
  NSAnimationContext.current.duration = 0.5
  barVersionFree.animator().setFrameOrigin(NSPoint(x: 0, y: -50))
  NSAnimationContext.endGrouping()
  barVersionFree.setFrameOrigin(NSPoint(x:0, y: -50))

没错。在 Cocoa 中,动画效果就是:对象外观的暂时扭曲。这可以包括对其不透明度、框架、大小、变换等的更改。当动画结束并被丢弃时,视图对象立即返回到与任何其他视图对象一样的行为。

如果您想使用这种类型的动画更改视图,解决方案是:

  1. 获取视图的框架
  2. 将视图的框架设置到您希望它结束​​的位置
  3. 从原来的位置开始动画 在现在的位置结束

然后视图似乎从 A 移动到 B,当动画结束时,帧现在位于 B。

另一种技术是添加 "did end animation" 处理程序并将框架设置到新位置,或者只是隐藏它。