swift - nswindow 动画师无法在窗口 Controller 中工作

标签 swift macos cocoa

我想制作向右滑动的动画,比如 Siri 窗口。所以在用户点击按钮后,我会:

self.myWindowController.showWindow(nil)

在窗口 Controller 中:

override func windowDidLoad() {
        super.windowDidLoad()

        if let window = window, let screen = window.screen {
            window.makeKeyAndOrderFront(nil)
            window.animationBehavior = .none

            let offsetFromLeftOfScreen: CGFloat = 30
            let offsetFromTopOfScreen: CGFloat = 30
            let screenRect = screen.visibleFrame
            let newOriginX = screenRect.maxX - window.frame.width - offsetFromLeftOfScreen
            let newOriginY = screenRect.maxY - window.frame.height - offsetFromTopOfScreen

            DispatchQueue.main.asyncAfter(deadline: .now()+1.0) {
                NSAnimationContext.beginGrouping()
                NSAnimationContext.current().duration = 3.0
                window.animator().setFrameOrigin(NSPoint(x: newOriginX, y: newOriginY))
                NSAnimationContext.endGrouping()
            }

            window.titleVisibility = .hidden
        }

但是窗口在延迟 1 秒后移动到右上角没有动画。为什么?

最佳答案

我认为使用不同的 API 来重置框架会成功。

尝试做这样的事情:

    let newFrame = CGRect(x: newOriginX, y: newOriginY, width: window.frame.size.width, height: window.frame.size.height)
    DispatchQueue.main.asyncAfter(deadline: .now()+1.0) {
        NSAnimationContext.runAnimationGroup({ (context) in
            context.duration = 3.0

            window.animator().setFrame(newFrame, display: true, animate: true)
        }, completionHandler: {
            print("animation done")
        })
    }

您也不需要显式设置 animationBehavior 属性,除非您自己绘制。把它拿出来。

关于swift - nswindow 动画师无法在窗口 Controller 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45858561/

相关文章:

ios - 在 SceneKit 中,快速尝试通过触摸来移动角色

Swift - 将核心数据与 Cocoa 结合使用

cocoa - Sparkle 框架问题(未显示正确的版本)

Objective-C 和 MetroWerks C/C++ IDE

objective-c - 将 iOS 棋盘游戏移植到 Mac,缺少的部分

ios - 在显示 View Controller 之前修改 View Controller 属性

swift - 如何在 TextView 中停止计时器?

ios - 未调用准备函数 - swift 3

macos - 点击独立QWidget时如何避免将QMainWindow带到最前面

c++ - XCode C++ 断言编译器不允许重新定义