【问题标题】:MAC Cocoa - Programmatically set window sizeMAC Cocoa - 以编程方式设置窗口大小
【发布时间】:2015-01-02 10:03:55
【问题描述】:

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

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

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

任何建议将不胜感激。万事开头难。

谢谢。

【问题讨论】:

    标签: macos cocoa nswindow


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。我找不到“启动时显示窗口”,但有“启动时可见”。你指的是这个吗?
    • 所以我尝试禁用“启动时可见”并在“applicationDidFinishLaunching”上显示窗口。它仍然在闪烁。似乎它首先以默认大小加载窗口,然后立即加载新大小。还有其他想法吗?
    【解决方案2】:

    applicationDidFinishLaunching 函数是一个做事的地方,嗯……只要应用程序完成启动。但是你真正想要的是在它刚刚从笔尖加载的时候捕捉窗口,但在它显示之前。 IOW,您试图在错误的地方执行此操作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      相关资源
      最近更新 更多