NSWindow的自定义标题栏

时间:2014-11-14 06:51:36

标签: xcode macos

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在这里做了一些改变吗?以及添加自定义标题栏的任何新方法?

1 个答案:

答案 0 :(得分:8)

是的,OS X Yosemite使用新的NSTitlebarAccessoryViewController API将自定义子视图添加到标题栏:

  

NSWindow从未支持客户将子视图添加到contentView以外的任何内容。某些应用程序会将子视图添加到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/