swift - 动画完成后 NSView 帧原点重置(动画代理)

标签 swift macos cocoa core-animation

动画代理setFrameOrigin使动画完成后 View 闪回到原点位置。我使用下面的代码对 NSView 进行动画处理,使其向下移动 -50 点,但是,当动画完成时,帧位置似乎重置为 0 code> 并导致 View 闪烁。

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

  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))

enter image description here

最佳答案

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

如果您想使用这种类型的动画更改 View 的某些内容,解决方案是:

  1. 获取 View 的框架
  2. 将 View 框架设置为您想要的结束位置
  3. 从原来的位置开始播放动画 结束于现在的位置

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

另一种技术是添加“结束动画”处理程序,并将框架设置到新位置,或者只是隐藏它。

关于swift - 动画完成后 NSView 帧原点重置(动画代理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48423092/

相关文章:

macos - Mac OS 将 ';' 替换为文本文件中的新行

objective-c - NSTimer 在 OS X(OS X 10.9) 上不正确

objective-c - 如何使大纲 View 像表格 View 一样可重新排序?

cocoa - Core Text 的 CTFramesetterSuggestFrameSizeWithConstraints() 每次都会返回错误的大小

swift - 如何检查 firebase 数据库值是否存在?

ios - 如何测试 Siren(https ://github. com/ArtSabintsev/Siren) 是否在我的应用程序上正常移动

macos - NSWindow 到底什么时候会变成圆角?

windows - 将特殊字符保存到 CSV 文件中,可以在 PC(Excel) 和 Mac(Numbers) 上打开

swift - 如何在 Swift 中将度数转换为风向

ios - 使用基本身份验证进行 Rest API 调用