以编程方式创建窗口

dev*_*ter 9 cocoa center nswindow

我一直在使用这里的示例创建一个自定义无标题栏窗口:

在Mac OS X上绘制自定义窗口

我发现这是我在Leopard,Snow Leopard和Lion中创建无标题栏窗口的唯一方法,其他方法在Leopard或Lion上都无法正常工作.(如果我尝试通过正常的NSWindow和IB调用无标题栏的窗口,它将不再在Leopard中启动)

到目前为止,这个自定义无标题栏的窗口在任何地方都很有用,但是我无法将它居中,只是在Interface Builder中只有一个固定的位置.

使用[窗口中心]将正常的NSWindow*窗口实现集中在一起相当容易,但我发现在这个自定义窗口子类上没有任何效果,这个窗口不是通过Interface Builder从nib创建的.

我从NSWindow尝试过一些东西,但似乎没什么用.

有任何想法吗?

小智 17

CGFloat xPos = NSWidth([[window screen] frame])/2 - NSWidth([window frame])/2;
CGFloat yPos = NSHeight([[window screen] frame])/2 - NSHeight([window frame])/2;
[window setFrame:NSMakeRect(xPos, yPos, NSWidth([window frame]), NSHeight([window frame])) display:YES];
Run Code Online (Sandbox Code Playgroud)

这将它放在屏幕的文字中心,而不考虑底座和菜单栏占用的空间.如果您想这样做,请更改[[window screen] frame][[window screen] visibleFrame].

  • 只需使用[窗口中心] (5认同)
  • 请记住,为了正确显示多个显示器,您还需要执行`xPos + = [[window screen] frame] .origin.x; yPos + = [[窗口屏幕]框架] .origin.y;` (2认同)

Kla*_*aas 6

extension NSWindow {
    public func setFrameOriginToPositionWindowInCenterOfScreen() {
        if let screenSize = screen?.frame.size {
            self.setFrameOrigin(NSPoint(x: (screenSize.width-frame.size.width)/2, y: (screenSize.height-frame.size.height)/2))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


CRD*_*CRD 5

问题可能应该是为什么[window center]不起作用;但假设是这种情况,请使用NSScreen获取屏幕坐标、进行数学计算并直接将窗口居中。