【问题标题】:Add Subview to NSWindow Titlebar将子视图添加到 NSWindow 标题栏
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 谢谢,我已经看过了,但不知道如何添加子视图。
  • 将子视图添加到他们的标题栏视图中,与[[[_window standardWindowButton:NSWindowCloseButton] superview] addSubview:_customTitlebarView]; 相同
  • 使用 El-Capitan,如果显示一张纸,交通信号灯会重置其位置。在全屏模式下还有更多问题。 Aaarggh 现在很难实现。
  • 为什么苹果不提供明确的 APIS,WAYAppStoreWindow 或 INAppStoreWindow 的问题在于它做了所有应该是苹果的代码。我的“INAppStoreWindow”有一个很好的副作用,因为每次运行后我的窗口大小都会不断增加......
【解决方案2】:

它只是一个 NSToolBar。在 Yosemite 中,当window.title.titleVisibility = .Hidden 时,NSToolBar 将成为标题栏

【讨论】:

  • 正如我在问题中已经提到的,出于样式的原因,我不想使用 NSToolBar,除非有一种方法可以像视图一样使用它并且能够在界面构建器中完全设计它(并使用自动布局)。我认为这是不可能的。
【解决方案3】:

将您的窗口分配给自己的视图。 然后添加带有框架的子视图 稍后提供所需的功能

【讨论】:

    【解决方案4】:

    感谢@ePirat

    将子视图添加到它们的标题栏视图中,与做的一样

    [[[_window standardWindowButton:NSWindowCloseButton] superview] addSubview:_customTitlebarView];
    

    【讨论】:

    • 这实际上不是一个非常有建设性的答案,因为它根本无法回答我的问题。它确实有效,但感觉很笨拙,就像 Apple 可能不喜欢在 App Store 应用程序中使用它一样。 (这种方式在全屏模式下还有一些问题)
    猜你喜欢
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多