添加Subview到NSWindow Titlebar

ePi*_*rat 27 cocoa objective-c appkit osx-yosemite nstitlebaraccessoryviewcontroller

我想创建一个自定义的窗口工具栏,但不使用实际的NSToolbar(因为它在某些情况下不能满足我的需要而且我不能按照我想要的方式设置它),因此我需要添加子视图到窗口标题栏.它应该如下所示:自定义工具栏的屏幕截图

一种可行的方式是:

[[[_window contentView] superview] addSubview:_titlebarView];
Run Code Online (Sandbox Code Playgroud)

但这有问题,它会在Yosemite(NSWindow warning: adding an unknown subview: <NSView: 0x608000122b20>)上引发警告,所以这似乎不是正确的方法.

目前我将工具栏视图添加到标题栏视图:

[[[_window standardWindowButton:NSWindowCloseButton]
    superview] addSubview:_titlebarView];
Run Code Online (Sandbox Code Playgroud)

但这也错了.

由于我的应用程序仅针对OS X 10.10(Yosemite),因此我可以使用仅限Yosemite的API,所以我看了一下,NSTitlebarAccessoryViewController并设法成功地将其子类化并使用它NSWindowaddTitlebarAccessoryViewController:方法.使用这种方法仍然存在一个问题,可能的值layoutAttribute是:

  • NSLayoutAttributeBottom
    将视图添加到窗口标题栏的底部,同时保留视图的高度.
  • NSLayoutAttributeRight
    将视图添加到窗口标题栏的右侧,将视图剪切到标题栏的高度.

NSLayoutAttributeBottom不适合我,因为我需要在窗口标题栏的顶部放置一些东西(见上面的截图)并将红绿灯居中. NSLayoutAttributeRight将是我所需要的,但我找不到增加标题栏高度的方法,因此视图被剪切到标题栏高度,这对我来说毫无用处.(注意:使用带纹理的窗口并更改内容边框不起作用,因为它不会更改实际的标题栏高度)

建议的方法是什么?我更愿意使用官方API并使用AccessoryViewController方法,如果可能有一个大于默认标题栏的视图.

小智 6

它只是一个NSToolBar.在优胜美地,当时window.title.titleVisibility = .Hidden,NSToolBar将成为标题栏


Fab*_*ian 4

WAYAppStoreWindow可能会满足您的需求。它是明确构建的,以避免 Yosemite 中的子视图警告,指定自定义窗口标题栏高度并将子视图添加到标题栏。

  • 将子视图添加到其 titlebarView 中,与执行 `[[[_window standardWindowButton:NSWindowCloseButton] superview] addSubview:_customTitlebarView];` 相同 (4认同)