我尝试以编程方式创建OS X窗口,如下所示:
print("creating window frame=\(winFrame)")
let window = NSWindow(contentRect: winFrame, styleMask: [NSWindowStyleMask.resizable, NSWindowStyleMask.closable, NSWindowStyleMask.miniaturizable, NSWindowStyleMask.titled], backing: NSBackingStoreType.buffered, defer: false)
print("after window frame=\(window.frame)")
我期待这两个输出应该是相同的,但这里是输出
creating window frame=(1556.0, 193.0, 421.0, 646.0)
after window frame=(1556.0, 193.0, 421.0, 668.0)
不同之处在于高度从646增加到668。
为什么会有这样的差异以及如何获得正确的号码?
答案 0 :(得分:1)
窗口的contentRect
是全局屏幕坐标中的矩形,由窗口的contentView
占用。这个rect 不包括窗口的标题栏。窗口的frame
确实包含标题栏。
如果你有一个想要的窗口框架,你可以计算相应的内容rect,然后用内容rect创建窗口:
let winFrame = ...
let styleMask: NSWindowStyleMask = [.resizable, .closable, .miniaturizable, .titled]
let contentRect = NSWindow.contentRect(forFrameRect: winFrame, styleMask: styleMask)
let window = NSWindow(contentRect: contentRect, styleMask: styleMask, backing: .buffered, defer: false)
或者您可以在创建后设置窗口的框架,如下所示:
let winFrame = ...
let styleMask: NSWindowStyleMask = [.resizable, .closable, .miniaturizable, .titled]
let window = NSWindow(contentRect: .zero, styleMask: styleMask, backing: .buffered, defer: false)
window.setFrame(winFrame, display: true)
答案 1 :(得分:1)
在创建NSWindow
时,您设置了不的contentRect
框架。
NSWindow对象由包围整个窗口的框架矩形定义,包括其标题栏,边框和其他外围元素(例如调整大小控件),以及仅包含其内容区域的内容矩形。 / p>
- 从窗口编程指南的How Windows Work页面
因此您获得了正确的窗口框架大小。要么通过传入较小的contentRect
来创建较小的一个,要么想要访问contentView.frame
属性。