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

MAC Cocoa - Programmatically set window size

我有一个 window 应用程序,它在屏幕上有一些复选框。

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

我的问题是找到正确的事件来读取和设置 window 属性。

目前我在:

- (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 但这似乎太早了,因为设置宽度和高度被简单地忽略了。

哪个事件适合插入此代码以在屏幕上显示之前立即重置 window?

如有任何建议,我们将不胜感激。万事开头难。

谢谢。

这是因为 window 的框架首先从 nib 加载,然后显示 window(一旦从 nib 加载完成)。

您可以在界面生成器中禁用 'show window on start' 复选框,并在 applicationDidFinishLaunching 中手动显示它。

applicationDidFinishLaunching 函数是一个执行任务的地方,好吧...一旦应用程序完成启动。但是您真正想要的是在 window 刚从笔尖加载但尚未显示时捕获它。 IOW,您尝试在错误的地方执行此操作。

你需要更多控制你的window,所以...创建你自己的window控制器!创建您自己的 class,它继承自 NSWindowController,例如 MyWindTrol。在实现文件中,添加awakeFromNib函数,把你的window的大小和位置控制在里面。

在你的 nib 文件中,从库中拖出一个 NSObject,声明它属于 class MyWindTrol,然后按住 Control 键拖动连接,这样你的 MyWindTrol 对象的 window 属性指向 window 对象。