初始NSWindow大小占屏幕大小的百分比

时间:2013-11-21 14:39:08

标签: cocoa interface-builder nswindow nswindowcontroller nswindowrestoration

我想将NSWindow大小设置为屏幕尺寸的函数。

Interface Builder中有一个选项可以按点设置它,但不能作为屏幕尺寸的函数。

如何以编程方式将其设置为默认值?

请注意,如果此状态可用,我仍希望UI保留从之前的会话恢复其大小。

2 个答案:

答案 0 :(得分:5)

嗯,你可以获得屏幕的大小,只需应用一点数学就可以实现这个功能。将窗口的尺寸设置为屏幕尺寸乘以您希望窗口占据的屏幕百分比。更进一步,你可以这样做,并通过将其原点乘以(1-percentage)/2.0来保持窗口居中。

NSRect screenSize = [[NSScreen mainScreen] frame];

CGFloat percent = 0.6;

CGFloat offset = (1.0 - percent) / 2.0;

[self.window setFrame:NSMakeRect(screenSize.size.width * offset, screenSize.size.height * offset, screenSize.size.width * percent, screenSize.size.height * percent) display:YES];

答案 1 :(得分:4)

将0x7fffffff的答案更进一步:这里是一个完整的Swift解决方案,适用于自动保存。使用XCode 7 Beta 6进行测试。

在界面构建器中,将窗口类设置为MainWindow,并在窗口的属性检查器中指定自动保存名称。以下代码仅在尚未存在自动保存信息时设置窗口坐标,即第一次显示窗口。之后(例如在重新启动应用程序之后)窗口将恢复到它的最后位置和大小。

class MainWindow: NSWindow {

    var didInitialResize = false

    override func awakeFromNib() {
        super.awakeFromNib()

        let defaults = UserDefaults.standard
        if !didInitialResize && defaults.object(forKey: "NSWindow Frame \(frameAutosaveName)") == nil {
            didInitialResize = true

            let screenSize = NSScreen.main!.frame

            let percent = CGFloat(0.90)
            let offset: CGFloat = CGFloat((1.0 - percent) / 2.0)

            setFrame(NSMakeRect(
                screenSize.size.width * offset,
                screenSize.size.height * offset,
                screenSize.size.width * percent,
                screenSize.size.height * percent),
                     display: true)
        }
    }
}

顺便说一下..自动保存信息保存在应用程序的首选项文件中。对于测试,rm ~/Library/Preferences/myapp.plist; sudo killall cfprefsd删除自动保存信息可能会有所帮助。