如何获取 NSWindow 的默认标题栏高度



我创建了一个 OS/X 应用程序,当它运行时,我将窗口定位在屏幕中央。为此,必须在计算 y 值时包括标题栏高度。

有没有办法确定默认标题栏?我希望(根据我对其他窗口系统的经验)我必须以某种方式查询窗口管理器......

我想出了这个解决方案。请注意,当窗口的styleMask包含 fullSizeContentView 时,这将返回 0.0 ,因为在这种情况下,标题栏实际上没有高度。

作为 Swift 扩展:

extension NSWindow {
    var titlebarHeight: CGFloat {
        frame.height - contentRect(forFrameRect: frame).height
    }
}

用法:

let titlebarHeight = someWindow.titlebarHeight

作为 Objective-C 类别扩展:

@implementation NSWindow (TitleBarHeight)
- (CGFloat) titlebarHeight
{
    return self.frame.size.height - [self contentRectForFrameRect: self.frame].size.height;
}
@end

用法:

CGFloat titlebarHeight = someWindow.titlebarHeight;

NSWindow上使用.fullSizeContentView时计算工具栏/标题栏区域高度的答案

if let windowFrameHeight = self.view.window?.contentView?.frame.height,
    let contentLayoutRectHeight = self.view.window?.contentLayoutRect.height {
    let fullSizeContentViewNoContentAreaHeight = windowFrameHeight - contentLayoutRectHeight
}

fullSizeContentViewNoContentAreaHeight是您想要的高度。这对于动态计算此值非常重要,因为如果你的应用使用 NSDocument并且用户创建新文档,系统可能会在新选项卡中打开此新文档。您可以在updateViewConstraints()执行此操作以检测此类更改。

来源: https://developer.apple.com/videos/play/wwdc2016/239/

不清楚是要使内容矩形居中,然后构建框架矩形以保持内容矩形居中,还是要使框架矩形居中并对相应的内容矩形感兴趣。

无论哪种情况,NSWindow都有会有所帮助的方法。在拥有实例之前,可以使用类方法 +frameRectForContentRect:styleMask:+contentRectForFrameRect:styleMask: 。这些考虑了样式掩码表示的窗口样式,但不考虑最终窗口可能具有的任何工具栏。

如果您正在使用现有实例,则可以使用方法 -frameRectForContentRect:-contentRectForFrameRect: 。那些使用窗口的当前样式并考虑其工具栏。(工具栏位于框架矩形内,但不位于内容矩形内。

您似乎决心使用屏幕的实际中心作为窗口。但是,您应该考虑使用 -center 方法 NSWindow .它将窗口水平居中定位,但实际上高于屏幕的真正垂直中心。它故意这样做,因为这对用户来说被认为更加突出和直接。

最新更新