使用NSAnimationContext.runAnimationGroup(_:_ :),如NSAnimationContext文档中所示,为框架原点和大小设置动画,就像某些视图类型(包括NS ImageView)一样.但是,除非我在动画后添加显式的帧大小更改,否则
动画NSImageView的帧大小
以下工作正如NSImageView所期望的那样.它被移动到原点,并调整为200×200:
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的框架?
我怀疑这与在运行时生成的隐式自动布局约束有关.修改框架后,自动布局只会将其恢复为原始大小.我放弃了原来的方法,支持以下方面:
>在Interface Builder中创建宽度和/或高度约束.我使用默认优先级1000(约束是必需的).
>为NSLayoutConstraint创建宽度和/或高度的插座.这在IB中很棘手:我必须双击检查器的测量选项卡中的约束,然后在检查器中打开约束对象.然后,您可以选择连接选项卡并连接插座.
>在我的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") }