【发布时间】:2021-04-08 14:35:56
【问题描述】:
考虑一个NSWindow,它的高度由一组复杂的约束控制,我希望在约束导致窗口调整大小时让窗口的大小调整动画。
作为一个简单的示例,我们假设 Window 没有子视图,而不是一组复杂的约束,我们只使用一个直接控制窗口内容视图高度的约束。 p>
现在,当我更改约束时,窗口会隐式调整大小。但是由于我自己没有设置窗口的框架(在复杂的模型中我无法预测新的大小!),我不能使用动画窗口调整大小的动画函数,该函数通常用于动画窗口调整大小。那么,当 Auto Layout 可以控制调整大小时,如何使调整大小动画化?
这是 Swift 中的一个示例。要使用它,只需在 Xcode 中创建一个新的普通“Cocoa App”项目,然后在 AppDelegate 中替换以下函数:
func applicationDidFinishLaunching(_ aNotification: Notification) {
let view = self.window.contentView!
// Add a height constraint to the window's view
let heightConstraint = NSLayoutConstraint.init(item: view, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: view.frame.size.height)
view.addConstraint(heightConstraint)
// Resize the window after a brief delay
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
// Now change the constraint, which results in the window getting resized instantly.
// But I would like the window's size change animated. How do I accomplish this?
NSAnimationContext.runAnimationGroup(
{ context in
context.duration = 0.5
heightConstraint.constant = heightConstraint.constant + 100
},
completionHandler:nil
)
}
}
【问题讨论】:
标签: objective-c swift macos autolayout nswindow