NSWindow与NSWindowTitleVisibilityNone将错误的帧保存到用户默认值?

Ben*_*ock 6 objective-c frame nsuserdefaults nswindow osx-yosemite

我的应用程序有一个选项,允许用户在标准的"全尺寸"窗口标题栏/工具栏和NSWindow10.10 API中提供的"紧凑"标题栏/工具栏之间进行选择.具体来说,我正在使用该-titleVisibility方法来设置NSWindowTitleVisibleNSWindowTitleHidden取决于用户的偏好.如果用户选中"Compact Titlebar"复选框,NSWindowTitleHidden则应用于窗口,否则,窗口将使用默认样式.当复选框值更改时,该值将存储在应用程序的用户默认值中,并且窗口将更新/重新绘制.

在重新启动应用程序之前,一切都很顺利.每次应用程序启动时,窗口都会通过从默认窗口样式(NSWindowTitleVisible)切换到新样式(NSWindowTitleHidden)来确切节省多少空间.因此,重新启动应用程序5-6次将使窗口与菜单栏和扩展坞齐平,具体取决于最初检查复选框时窗口的大小.

换句话说,在NSUserDefaults设置属性时,似乎不会更新窗口的框架.有没有解决方法,或者我只是忽略了什么?任何建议都会有用.

谢谢!

Nig*_*lve 0

现在的简单修复方法是手动保存和恢复窗口的框架,我是这样做的:

在您的应用程序委托中,当应用程序终止时,保存窗口的框架

- (void)applicationWillTerminate:(NSNotification *)notification
{
    [[NSUserDefaults standardUserDefaults] setObject:NSStringFromRect(self.windowController.window.frame) forKey:@"WindowFrameKey"];
}
Run Code Online (Sandbox Code Playgroud)

在窗口控制器的 -awakeFromNib 方法中,恢复框架

- (void)awakeFromNib
{
    if([NSWindow instancesRespondToSelector:@selector(setTitleVisibility:)])
    {
        // Hide Titlebar
        [self.window setTitleVisibility:NSWindowTitleHidden];

        NSString *winFrameString = [[NSUserDefaults standardUserDefaults] stringForKey:@"WindowFrameKey"];

        if(winFrameString != nil)
        {
            NSRect savedRect = NSRectFromString(winFrameString);

            if(!NSEqualRects(self.window.frame, savedRect))
            {
                [self.window setFrame:savedRect display:YES animate:NO];
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)