在将窗口缩放到最小大小后如何避免运行窗口?

时间:2020-09-08 10:30:33

标签: swift macos swiftui

通过NSSize,主窗口具有最小的宽度,高度和长宽比。但是,当窗口缩放到最小尺寸时,如果调整大小事件不断从顶部触发,它将开始在屏幕上向下运行。或右窗角。

这里是否缺少窗口属性?

let contentView = ContentView()
    .frame(minWidth: 120, maxWidth: .infinity, minHeight: 50, maxHeight: .infinity)
    .edgesIgnoringSafeArea(.all)

/// Create the window and set the content view.
window = NSWindow(
    contentRect: NSRect(x: 0, y: 0, width: 120, height: 50),
    styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
    backing: .buffered, defer: false, onKeyDown: handleKeyDownEvent)

window.contentView = NSHostingView(rootView: contentView)
window.contentView?.window?.aspectRatio = NSSize(
    width: 120,
    height: 50
)

试图阻止通过窗口委托方法windowWillResize(_:to:) source调整窗口大小,但是当窗口被挤压时,它仍然在运行。

还尝试使用windowWillMove(_:) source打印窗口位置,并意图阻止它移动。但是,通过挤压窗口更改的位置不会在调试控制台中捕获。

enter image description here

1 个答案:

答案 0 :(得分:0)

删除

window.contentView?.window?.aspectRatio = NSSize(
    width: 120,
    height: 50
)

使窗口按比例调整大小的更好方法是在windowWillResize(_:to:)NSWindowDelegate方法中进行调整。如果您以编程方式设置了所有用户界面,请不要忘记设置window.delegate

extension AppDelegate: NSWindowDelegate {
    func windowWillResize(_ sender: NSWindow, to frameSize: NSSize) -> NSSize {
        return CGSize(width: frameSize.height * SOME_RATIO, height: frameSize.height)
    }
}