首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSWindow使用NSWindowTitleVisibilityNone将不正确的帧保存到用户默认值?

NSWindow使用NSWindowTitleVisibilityNone将不正确的帧保存到用户默认值?
EN

Stack Overflow用户
提问于 2014-11-12 06:11:10
回答 3查看 1.3K关注 0票数 6

我的应用程序有一个选项,允许用户在标准的“全尺寸”窗口标题栏/工具栏和NSWindow 10.10API中提供的“紧凑”标题栏/工具栏之间进行选择。具体来说,我使用-titleVisibility方法根据用户的喜好设置NSWindowTitleVisibleNSWindowTitleHidden。如果用户选中"Compact“复选框,则将NSWindowTitleHidden应用于该窗口,否则,该窗口将使用默认样式。当复选框值发生变化时,该值将存储在应用程序的默认用户中,窗口将被更新/重新绘制。

在应用程序重新启动之前,一切都很好。每次应用程序启动时,窗口都会根据从默认窗口样式(NSWindowTitleVisible)切换到新样式(NSWindowTitleHidden)所节省的空间来增长。因此,重新启动应用程序5-6次将使窗口与菜单和码头齐平,这取决于最初选中复选框时窗口有多大。

换句话说,在设置属性时,NSUserDefaults中似乎没有更新窗口的框架。有办法解决这个问题吗,还是我忽略了什么?任何建议都会很有帮助。

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2015-12-02 18:34:06

一个更好的(并得到证实的工作)解决方案已通过点贴在https://openradar.appspot.com/18510665上。

问题是,在设置-[NSWindow setFrameUsingName:]之前,系统使用titleVisibility恢复窗口大小。解决方案:

  1. 删除接口生成器中的“自动保存名称”值。
  2. 在使用titleVisibility设置-[NSWindow setFrameAutosaveName:]后,将其设置为代码。
票数 3
EN

Stack Overflow用户

发布于 2015-06-06 08:00:37

尝试将titleVisibility属性设置为用户定义的运行时属性中的数字1

1是NSWindowTitleHidden的对应值。

代码语言:javascript
复制
typedef NS_ENUM(NSInteger, NSWindowTitleVisibility) {
    /* The default mode has a normal window title and titlebar buttons. */
    NSWindowTitleVisible  = 0,
    /* The always hidden mode hides the title and moves the toolbar up into the area previously occupied by the title. */
    NSWindowTitleHidden = 1,
} NS_ENUM_AVAILABLE_MAC(10_10);

但是,这将向控制台打印一条消息,抱怨NSWindow与10.10之前的OS版本的key titleVisibility不兼容。

票数 2
EN

Stack Overflow用户

发布于 2015-01-10 15:24:06

现在,简单的修复方法是手动保存和恢复窗口的框架(),如下所示:

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

代码语言:javascript
复制
- (void)applicationWillTerminate:(NSNotification *)notification
{
    [[NSUserDefaults standardUserDefaults] setObject:NSStringFromRect(self.windowController.window.frame) forKey:@"WindowFrameKey"];
}

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

代码语言:javascript
复制
- (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];
            }
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26880423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档