双击透明 NSWindow 标题不会最大化窗口

Posted

技术标签:

【中文标题】双击透明 NSWindow 标题不会最大化窗口【英文标题】:double click on transparent NSWindow title does not maximize the window 【发布时间】:2018-09-03 13:41:12 【问题描述】:

在 High Sierra 10.13 上,我有一个 NSWindowController 的子类,它像这样配置它的窗口:

有标题栏 透明标题栏 全尺寸内容视图 有阴影 没有纹理 可以关闭、最小化、调整大小 可通过窗口背景移动

问题是当用户双击标题栏时,窗口无法缩放或最小化。

使用常规标题栏,双击照常工作。

我看到许多具有类似 NSWindow 配置的应用程序都支持双击(例如 Safari)。

我错过了什么?

【问题讨论】:

我在莫哈韦也看到了同样的情况。 你能解决这个问题吗? @prabhu 不,我很抱歉。我写了一些代码来检测双击并缩放窗口,但后来我没有使用它,因为我将窗口样式更改为不透明的标题栏。 【参考方案1】:

子类NSWindow 并使用contentLayoutRect 属性来计算titleBar 矩形。如果双击在该矩形内,则触发缩放。

这是 Swift 5 中的代码:

import Cocoa

class MyWindow: NSWindow 

    override func mouseUp(with event: NSEvent) 
        if event.clickCount >= 2 && isPointInTitleBar(point: event.locationInWindow)  // double-click in title bar
            self.performZoom(nil)
        
        super.mouseUp(with: event)
    

    fileprivate func isPointInTitleBar(point: CGPoint) -> Bool 
        if let windowFrame = self.contentView?.frame 
            let titleBarRect = NSRect(x: self.contentLayoutRect.origin.x, y: self.contentLayoutRect.origin.y+self.contentLayoutRect.height, width: self.contentLayoutRect.width, height: windowFrame.height-self.contentLayoutRect.height)
            return titleBarRect.contains(point)
        
        return false
    


为了完整起见,这里是contentLayoutRect 的文档:

通常,该属性表示的区域与 contentView 的框架相同。但是,对于设置了 NSFullSizeContentViewWindowMask 的窗口,需要有一种方法来确定不在工具栏下方的部分。 contentLayoutRect 属性包含在工具栏下未被遮挡的布局部分。此属性符合 KVO。

【讨论】:

感谢您分享这个sn-p!

以上是关于双击透明 NSWindow 标题不会最大化窗口的主要内容,如果未能解决你的问题,请参考以下文章

调整窗口大小时带有约束的宽度限制

macOS SwiftUI,内容不填充没有标题栏的 NSWindow

如何检测一个窗口已经被最大化?

事件在透明 NSWindow 中的 NSView 中不起作用

easyui表格点击某行后无法切换

WPF 窗口透明度(包括非客户区)