MAC Cocoa - 以编程方式设置窗口大小

时间:2015-01-02 10:03:56

标签: macos cocoa nswindow

我有一个窗口应用程序,屏幕上有一些复选框。

我使用NSUserDefaults不仅存储复选框的状态,还存储主窗口的宽度,高度和位置(x / y)。

我的问题是找到正确的事件来阅读和设置窗口属性。

目前我这样做:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// read preferences
UserPreferences *userPrefs = [[UserPreferences alloc] init];  
NSRect oldFrame = [window frame];  
if( [userPrefs MainWindowWidth] > 0)
    oldFrame.size.width = [userPrefs MainWindowWidth];

if( [userPrefs MainWindowHeight] > 0)
    oldFrame.size.height = [userPrefs MainWindowHeight];

if( [userPrefs MainWindowTop] > 0)
    oldFrame.origin.y = [userPrefs MainWindowTop];

if( [userPrefs MainWindowLeft] > 0)
    oldFrame.origin.x = [userPrefs MainWindowLeft];

// set windows properties
[window setFrame:oldFrame display:YES animate:NO];
}

它有效,但屏幕首先显示默认大小,然后更改为存储的大小,以便在视觉上打嗝。这告诉我在事件链中设置这些参数为时已晚。

我也尝试过awakefromnib,但由于设置宽度和高度被忽略,因此在链中看起来太早了。

在屏幕上显示窗口之前插入此代码以重置窗口的哪个事件是正确的?

任何建议将不胜感激。每个开始都很难。

谢谢。

2 个答案:

答案 0 :(得分:1)

这是因为窗口的框架首先从笔尖加载,然后显示窗口(一旦从笔尖加载完毕)。

您可以在界面构建器中禁用“启动时显示窗口”复选框,并在applicationDidFinishLaunching中手动显示它。

答案 1 :(得分:0)

applicationDidFinishLaunching函数是一个做事的地方,嗯......一旦应用程序完成启动。但是你真正想要的是在它刚从笔尖加载时,但在它显示之前抓住窗口。 IOW,你试图在错误的地方做这件事。

您的窗口需要更多控制,因此......创建自己的窗口控制器!创建自己的类,继承自NSWindowController,比如MyWindTrol。在实现文件中,添加awakeFromNib函数,并努力控制窗口的大小和位置。

在你的nib文件中,从库中拖出一个NSObject,声明它是MyWindTrol类,然后控制 - 拖动连接,使你的MyWindTrol对象的window属性指向window对象。