在Cocoa中隐藏标题栏上的按钮

28

苹果公司的人机界面指南指出:

macOS 人机界面指南: 面板

我该如何制作像图片中第一个标题栏(只有关闭按钮)?在接口构建器(IB)中禁用调整大小最小化只会使调整大小和最小化按钮变灰,但我想让它们消失。我该怎么做?

4个回答

57

我认为这应该可以正常工作:

[[window standardWindowButton:NSWindowCloseButton] setHidden:YES];
[[window standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES];
[[window standardWindowButton:NSWindowZoomButton] setHidden:YES];

2
并且使用[[window standardWindowButton:NSWindowCloseButton] setHidden:YES];来隐藏关闭按钮(如果已显示)。 - Beny
@pkamb 需要帮助将屏幕设置回全屏。 - AJit
完美,正是我在尝试创建类似Quicktime播放器的界面时所寻找的。 - Sam Rowlands

12

被接受的答案的 Swift 代码

window!.standardWindowButton(.miniaturizeButton)!.isHidden = true
window!.standardWindowButton(.zoomButton)!.isHidden = true
window!.standardWindowButton(.closeButton)!.isHidden = true

无法工作(在xcode 9.2上)...标题和关闭、最小化按钮、全屏按钮仍然存在。 - themihai

2

我也需要这个但是对鼠标悬停可见 - Swift:

var trackingTag: NSTrackingRectTag?
override func mouseEntered(with theEvent: NSEvent) {
    if trackingTag == theEvent.trackingNumber {
        window!.standardWindowButton(.closeButton)!.alphaValue = 1.00
    }
}
override func mouseExited(with theEvent: NSEvent) {
    if trackingTag == theEvent.trackingNumber {
        window!.standardWindowButton(.closeButton)!.alphaValue = 0.01
    }
}
func updateTrackingAreas(_ establish : Bool) {
    if let tag = trackingTag {
        window!.standardWindowButton(.closeButton)!.removeTrackingRect(tag)
    }
    if establish, let closeButton = window!.standardWindowButton(.closeButton) {
        trackingTag = closeButton.addTrackingRect(closeButton.bounds, owner: self, userData: nil, assumeInside: false)
    }
}
override func windowDidLoad() {
    window!.ignoresMouseEvents = false
    updateTrackingAreas(true)
    window!.standardWindowButton(.closeButton)!.alphaValue = 0.01
}
func windowShouldClose(_ sender: Any) -> Bool {
    window!.ignoresMouseEvents = true
    updateTrackingAreas(false)
    return true
}

需要一定的可见性,但只需略微透明 - 0.01的不透明度,以使跟踪区域有效。


1
另一种方法是...
for (id subview in [self window].contentView.superview.subviews) {
    if ([subview isKindOfClass:NSClassFromString(@"NSTitlebarContainerView")]) {
        NSView *titlebarView = [subview subviews][0];
        for (id button in titlebarView.subviews) {
            if ([button isKindOfClass:[NSButton class]]) {
                [button setHidden:YES];
            }
        }
    }
}

你能详细阐述一下你的答案吗?我的意思是为什么它不同,以及它是如何不同的。 - Fawzan
@Fawzan,这种方法可以应用于自定义标题视图。 - csaint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接