2014-11-14 127 views
2

我一直在尝试为NSWindow创建一个自定义标题栏,在Creating a custom title bar on a standard NSWindow的帮助下。NSWindow的自定义标题栏

NSView *themeFrame = [[window contentView] superview]; 
NSView *firstSubview = [[themeFrame subviews] objectAtIndex:0]; 
[titleBarView setAutoresizingMask:(NSViewMinYMargin | NSViewWidthSizable)]; 
[themeFrame addSubview:titleBarView positioned:NSWindowBelow relativeTo:firstSubview]; 

它非常适用OSX 10.9,但在OSX 10.10,Xcode的职位华林:

NSWindow warning: adding an unknown subview:XXX 
0 AppKit        0x00007fff88f80b3c -[NSThemeFrame addSubview:] + 107 
1 AppKit        0x00007fff8896fb8f -[NSView addSubview:positioned:relativeTo:] + 208 

应用程序可以运行良好,并显示自定义的标题,这个警告只显示在Xcode控制台。 那么OSX 10.10在这里做一些改变?和任何新的方法来添加自定义标题栏?

+0

正在一个自定义标题栏是一个好主意?作为用户,我很欣赏一致性。 – trojanfoe

+0

感谢大家,是的,我们最好在我们的应用中充分利用原有的用户界面。我刚刚找到了https://github.com/indragiek/INAppStoreWindow,并自己尝试过,但不知道为什么这个问题出现在OSX 10.10中。 – GoKu

+1

如果你使用OS X Yosemite试图使用'''INAppStoreWindow''',这是一个伟大的软件,请考虑切换到'''WAYAppStoreWindow'''。这是一个在运行时选择正确的NSWindow子类的包装器。 – Raffael

回答

8

是,OS X优胜美地采用了新的NSTitlebarAccessoryViewController API添加自定义子视图标题栏:

NSWindow从来没有支持的客户端添加子视图比内容查看其他任何东西。有些应用程序会将子视图添加到contentView.superview(也称为窗口的边框视图)。 NSWindow现在会在检测到这种情况时进行登录:“NSWindow警告:添加未知子视图:”。这样做的应用程序需要解决这个问题,因为它阻止了10.10上的新功能正常工作。有关官方API,请参阅titlebarAccessoryViewControllers。

NSWindow现在可以将正式已知的子视图添加到标题栏/工具栏区域。这些视图将被一个名为NSTitlebarAccessoryViewController的新的NSViewController子类包装,并通过“titlebarAccessoryViewControllers”API添加到窗口中。有一组方法可以添加和插入titlebarAccessoryViewControllers,例如addTitlebarAccessoryViewController:和removeTitlebarAccessoryViewControllerAtIndex :.但是,也可以使用“removeFromParentViewController”轻松移除给定的子视图控制器。 NSTitlebarAccessoryViewController有一个属性来告诉NSWindow放置视图的位置(layoutAttribute)和一个属性以确定它在全屏幕中的行为(fullScreenMinHeight)。 NSToolbar fullScreenAccessoryView API现在已被弃用,客户端应该使用这个新的API。

https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/