微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当 NSWindow 被自动布局调整大小时,如何动画它的大小变化?

如何解决当 NSWindow 被自动布局调整大小时,如何动画它的大小变化?

考虑一个高度由一组复杂约束控制的 NSWindow,并且我希望在约束导致窗口调整大小时对窗口的调整大小进行动画处理。

作为一个简单的示例,让我们假设 Window 没有子视图,而不是一组复杂的约束,我们只使用一个直接控制窗口内容视图高度的约束。 >

现在,当我更改约束时,窗口会隐式调整大小。但是由于我没有自己设置窗口的框架(在复杂模型中我无法预测新的大小!),我不能使用通常用于动画窗口大小调整的动画窗口大小调整功能。那么,当自动布局可以控制调整大小时,如何使调整大小动画化?

这是一个 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
        )

    }
}

解决方法

有一个用于约束的代理对象。而不是改变约束的常数,设置 animator() 的常数。它将动画。在动画结束后调用 self.layoutSubtreeIfNeeded() 更新约束。

NSAnimationContext.runAnimationGroup({ context in
    context.duration = 0.5
    context.allowsImplicitAnimation = true
    heightConstraint.animator().constant = heightConstraint.constant + 100
},completionHandler: {
    view.layoutSubtreeIfNeeded()
})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。