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



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

我使用 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,但这似乎在链中还为时过早,因为设置宽度和高度被简单地忽略了。

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

任何建议将不胜感激。每一个开始都是艰难的。

谢谢。

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

您可以在界面构建器中禁用"启动时显示窗口"复选框,并在应用程序DidFinishLaunching中手动显示它。

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

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

在 nib 文件中,从库中拖动一个 NSObject,将其声明为 MyWindTrol 类,然后按住 Control 键拖动连接,以便 MyWindTrol 对象的窗口属性指向窗口对象。

最新更新