添加按钮到窗口标题栏

时间:2012-03-31 12:00:02

标签: xcode macos cocoa button

过去几天,我一直在努力研究如何做一些看起来很简单的事情。我已经四处搜索但找不到任何东西。

我希望能够在Mac上打开的所有窗口都添加一个按钮(它将放在右侧,与#34; X"""" #34; +"按钮)。我相信我想添加按钮的区域称为标题栏,虽然我对此不太确定。

我似乎无法在界面构建器中找到一种方法。但即使我这样做,我希望按钮出现在Mac上打开的所有窗口上(显然一旦用户安装了这个程序)。

据我所知,这基本上是"插入"操作系统的用户界面,但我看到其他应用程序这样做,这让我觉得它是可行的。

只是寻找一些指示,我可以阅读它,代码片段和一般建议,我会采取任何措施。

以下是我想要按钮的屏幕截图:

Screenshot

4 个答案:

答案 0 :(得分:11)

官方支持的在OS X 10.10(Yosemite)中添加标题栏按钮的方法是创建NSTitlebarAccessoryViewController并使用-[NSWindow addTitlebarAccessoryViewController]将其添加到您的窗口。

例如,我有一个带标题栏配件视图的窗口:

demo window title bar

要进行此设置,我首先在故事板中向窗口控制器场景添加一个独立视图。 (你不必使用故事板,但我在这个项目中做过。)

accessory view

我的附件视图是带有NSView子视图的NSButton。按钮标题使用Font Awesome来显示图钉。

我将附件视图连接到我的accessoryView子类中的插座(巧妙地命名为NSWindowController):

outlet connection

然后,在我的窗口控制器windowDidLoad中,创建NSTitlebarAccessoryViewController,设置其属性,并将其添加到窗口中:

@IBOutlet var accessoryView: NSView!
var accessoryViewController: NSTitlebarAccessoryViewController?

override func windowDidLoad() {
    super.windowDidLoad()
    createAccessoryViewControllerIfNeeded()
}

fileprivate func createAccessoryViewControllerIfNeeded() {
    guard self.accessoryViewController == nil else { return }
    let accessoryViewController = NSTitlebarAccessoryViewController()
    self.accessoryViewController = accessoryViewController
    accessoryViewController.view = accessoryView
    accessoryViewController.layoutAttribute = .right
    self.window?.addTitlebarAccessoryViewController(accessoryViewController)
}

答案 1 :(得分:7)

此答案解决了最新的 Xcode版本9.3

  • 转到故事板。
  • 将故事板中的工具栏拖放到窗口。

enter image description here

  • 工具栏将显示在标题下方。

enter image description here

  • 在故事板上找到窗口

enter image description here

  • 选中窗口属性中的“隐藏标题”。

enter image description here

  • 工具栏现在是标题的一部分。

enter image description here

答案 2 :(得分:6)

这实际上是一个由两部分组成的问题。至于如何获得按钮,我建议使用-[NSWindow standardWindowButton:]来获取现有的窗口按钮及其超级视图(即标题栏):

NSButton *closeButton = [window standardWindowButton:NSWindowCloseButton]; // Get the existing close button of the window. Check documentation for the other window buttons.
NSView *titleBarView = closeButton.superview; // Get the view that encloses that standard window buttons.
NSButton *myButton = …; // Create custom button to be added to the title bar.
myButton.frame = …; // Set the appropriate frame for your button. Use titleBarView.bounds to determine the bounding rect of the view that encloses the standard window buttons.
[titleBarView addSubview:myButton]; // Add the custom button to the title bar.

插件可能最容易作为SIMBL插件。

答案 3 :(得分:0)

快速4-在NSWindowController中添加以下代码

if let window = window {
    let myButton = NSButton()
    myButton.title = "Help"
    myButton.bezelStyle = .rounded

    let titleBarView = window.standardWindowButton(.closeButton)!.superview!
    titleBarView.addSubview(myButton)
    myButton.translatesAutoresizingMaskIntoConstraints = false
    titleBarView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[myButton]-2-|", options: [], metrics: nil, views: ["myButton": myButton]))
    titleBarView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-1-[myButton]-3-|", options: [], metrics: nil, views: ["myButton": myButton]))
}

希望这会有所帮助。