【发布时间】:2015-02-24 03:30:40
【问题描述】:
我想创建一个自定义窗口工具栏,但不使用实际的 NSToolbar(因为它在某些情况下不能满足我的需要,而且我无法按照我想要的方式设置它),因此我需要添加一个窗口标题栏的子视图。 它应该如下所示:
一种可能的方法是:
[[[_window contentView] superview] addSubview:_titlebarView];
但这有一个问题,它会在 Yosemite (NSWindow warning: adding an unknown subview: <NSView: 0x608000122b20>) 上引起警告,所以这似乎不是正确的方法。
目前我正在将工具栏视图添加到标题栏视图:
[[[_window standardWindowButton:NSWindowCloseButton]
superview] addSubview:_titlebarView];
但这也感觉不对。
由于我的应用程序仅针对 OS X 10.10 (Yosemite),因此我可以使用仅限 Yosemite 的 API,因此我查看了 NSTitlebarAccessoryViewController 并成功地将其子类化并与 NSWindow 一起使用的addTitlebarAccessoryViewController: 方法。使用这种方法仍然存在一个问题,layoutAttribute 的可能值是:
-
NSLayoutAttributeBottom
将视图添加到窗口标题栏的底部,同时保留视图的高度。 -
NSLayoutAttributeRight
将视图添加到窗口标题栏的右侧,将视图剪切到 标题栏。
NSLayoutAttributeBottom 不适合我,因为我需要正确定位
在窗口标题栏的顶部(参见上面的屏幕截图)并将红绿灯居中。
NSLayoutAttributeRight 正是我所需要的,但我找不到增加标题栏高度的方法,所以视图被剪裁到标题栏高度,这对我来说毫无用处。 (注意:使用带纹理的窗口并更改内容边框不起作用,因为它不会更改实际的标题栏高度)
推荐的方法是什么?如果视图可能大于默认标题栏,我更愿意使用官方 API 并使用 AccessoryViewController 方法。
【问题讨论】:
-
啊!这也困扰着我......
-
仅供参考,您仍然可以使用您当前使用的方法...但它只会产生警告。
-
@SevenBits 我知道我可以使用它,但是在发行说明中有一个明确的说明:“这样做的应用程序需要解决这个问题,因为它会阻止 10.10 上的新功能正常工作。”在Mac OS X Developer Release Note
-
在使用新的标题栏附件视图时,我看到了另一个问题:核心图形行为以某种方式发生了变化,这给我使用的第 3 方代码带来了麻烦(EDSidebar 的警告,cocoacontrols.com/controls/edsidebar,并使用空上下文,CorePlot,github.com/core-plot/core-plot)。我可以可靠地重现它。当我添加附件视图时发生,当我删除它时消失。
-
@MikeLischke 例如什么警告?你是如何添加它的? (哪个 layoutAttribute?)
标签: objective-c cocoa osx-yosemite appkit nstitlebaraccessoryviewcontroller