NSAnimationContext不会为NSButton动画帧大小



使用NSAnimationContext文档中演示的NSAnimationContext.runAnimationGroup(_:_:)来动画帧原点大小对某些视图类型(包括NSImageView)来说都是预期的。但是,对于NSButton,除非我在动画

之后添加显式的帧大小更改,否则它不会像预期的那样工作。

设置NSImageView的动画帧大小

下面的工作如预期的NSImageView。它被移动到原点,并调整大小为200x200:

NSAnimationContext.runAnimationGroup({(let context) -> Void in
    context.duration = 2.0
    // Get the animator for an NSImageView
    let a = self.theImage.animator()
    // Move and resize the NSImageView
    a.frame = NSRect(x: 0, y: 0, width: 200, height: 200)
}) {
    print("Animation done")
}

NSButton设置动画帧大小

当对NSButton执行相同的操作时,按钮将移动,但不会调整:

的大小。
NSAnimationContext.runAnimationGroup({(let context) -> Void in
    context.duration = 2.0
    // Get the animator for an NSButton
    let a = self.button.animator()
    // Move and resize the NSImageView
    a.frame = NSRect(x: 0, y: 0, width: 200, height: 200)
}) {
    print("Animation done")
}

但是,如果我将以下代码行添加到末尾,在所有动画代码之后,它就会像预期的那样工作!

self.button.frame = NSRect(x: 0, y: 0, width: 200, height: 200)
NSButton的最终工作清单是:
NSAnimationContext.runAnimationGroup({(let context) -> Void in
    context.duration = 2.0
    // Get the animator for an NSButton
    let a = self.button.animator()
    // Move and resize the NSImageView
    a.frame = NSRect(x: 0, y: 0, width: 200, height: 200)
}) {
    print("Animation done")
}
self.button.frame = NSRect(x: 0, y: 0, width: 200, height: 200)

我不是在吹毛求疵,但我不明白为什么NSButton需要这个,甚至不明白是什么使它工作。有人能解释为什么在动画代码之后显式地设置NSButton 的帧使动画工作吗?

我怀疑这与在运行时生成的隐式自动布局约束有关。修改框架后,自动布局只是将其恢复到原始大小。

我放弃了原来的方法,转而采用以下方法:

  1. 在界面生成器中创建宽度和/或高度约束。我使用默认的优先级1000(约束是强制性的)。
  2. 创建宽度和/或高度为NSLayoutConstraint的出口。这在IB中很棘手:我必须在检查器的测量选项卡中双击约束,然后在检查器中打开约束对象。然后,您可以选择connections选项卡并连接出口。
  3. 在我的NSViewController子类中,我使用锚来定义新的高度或宽度:theWidthConstraint.constant = 200之后是self.view.needsUpdateConstraints = true

这种方法更干净,与自动布局系统更兼容。此外,它可以很容易地动画整个布局的变化,结果从新的自动布局:

NSAnimationContext.runAnimationGroup({(let context) -> Void in
    context.duration = 1.0
    self.theWidthConstraint.animator().constant = 200
    // Other constraint modifications can go here
}) {
    print("Animation done")
}

相关内容

  • 没有找到相关文章

最新更新