【问题标题】:How can I disable the close button?如何禁用关闭按钮?
【发布时间】:2016-01-19 20:14:25
【问题描述】:

我需要一些帮助来弄清楚如何在 OS X Cocoa 和 Swift 2 中禁用/隐藏关闭、最小化和调整大小按钮。这是我尝试过的代码。我知道它是用于标题栏的,但我想我还是会尝试一下:

self.window.titleVisibility = NSWindowTitleVisibility.Hidden;

有人知道怎么做吗?我正在使用 Swift 2、OS X Cocoa 和 Xcode 7.2。谢谢!

【问题讨论】:

  • 不能直接在 Interface Builder 中选择?
  • 不幸的是它不是,因为我需要在按下按钮时完成它。

标签: swift macos cocoa


【解决方案1】:

也试试;

    self.window!.standardWindowButton(NSWindow.ButtonType.closeButton)!.hidden = true
    self.window!.standardWindowButton(NSWindow.ButtonType.miniaturizeButton)!.hidden = true

等等

【讨论】:

  • 我遇到了与其他代码相同的错误:“使用未解析的标识符 'window'”
  • @TDM 将 window 替换为指向您的窗口的任何变量名称
  • @AaronBrager 如何将变量设置为等于我的窗口?顺便说一句,感谢您的帮助。我是 Swift 编程新手,所以这个网站很有帮助。
  • 你可能需要self.window!。我编辑了答案。
  • 对于 Swift 4,应该改为:self.window!.standardWindowButton(NSWindow.ButtonType.closeButton)!.isHidden = trueself.window!.standardWindowButton(NSWindow.ButtonType.miniaturizeButton)!.isHidden = true
【解决方案2】:

在 Xcode 9.1 中,您可以在 ViewController 中使用以下内容,

override func viewWillAppear() {

    self.view.window?.titleVisibility = .hidden
    self.view.window?.titlebarAppearsTransparent = true

    self.view.window?.styleMask.insert(.fullSizeContentView)

    self.view.window?.styleMask.remove(.closable)
    self.view.window?.styleMask.remove(.fullScreen)
    self.view.window?.styleMask.remove(.miniaturizable)
    self.view.window?.styleMask.remove(.resizable)

    //self.view.window?.isMovable = false
}

覆盖 func viewWillAppear() {

    self.view.window?.titleVisibility = .hidden
    self.view.window?.titlebarAppearsTransparent = true

    self.view.window?.styleMask.insert(.fullSizeContentView)

    //self.view.window?.styleMask.remove(.closable)
    self.view.window?.styleMask.remove(.fullScreen)
    self.view.window?.styleMask.remove(.miniaturizable)
    self.view.window?.styleMask.remove(.resizable)

    //self.view.window?.isMovable = false
}

【讨论】:

  • 在带有情节提要的 Xcode 版本 11.4 beta 2 (11N123k) 中运行良好。
【解决方案3】:

查看NSWindow.styleMask 属性和Window Style Masks

清除 NSClosableWindowMask、NSMiniaturizableWindowMask 和 NSResizableWindowMask 标志将删除窗口标题栏中的所有按钮。

window.styleMask &= ~(NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask)

【讨论】:

  • 我在窗口部分收到一个错误,上面写着“使用未解析的标识符 'window'”
  • @Sulthan 这就是你在 Swift 中的做法。
  • Swift 3 抛出这个:Binary operator '|' cannot be applied to two 'NSWindowStyleMask' operands
【解决方案4】:

我发现以下内容有效地禁用而不完全隐藏关闭按钮:

self.view.window?.standardWindowButton(NSWindow.ButtonType.closeButton)?.isEnabled = false

【讨论】:

    【解决方案5】:

    附注:不要禁用“关闭”红色按钮:苹果会拒绝应用说:

    “您的应用程序的用户界面与macOS人机界面指南不一致。具体:

    具体来说,红灯被禁用了。”

    :(

    【讨论】:

    • 很高兴知道。不过,如果该应用没有在 App Store 上出售,这并不重要
    • 是的。我写信是为了帮助其他一些碰巧落在这里的人:)
    【解决方案6】:

    如果您使用 Storyboards,并且您可以在 IBAction 或 viewDidLoad 中更改窗口 styleMask 属性,如下所示:

    NSApplication.sharedApplication().windows.first?.styleMask = NSTitledWindowMask   // | NSClosableWindowMask |  NSMiniaturizableWindowMask  | NSResizableWindowMask
    

    如果您想再次启用它们,只需取消注释样式掩码的其余部分:

    NSApplication.sharedApplication().windows.first?.styleMask = NSTitledWindowMask | NSClosableWindowMask |  NSMiniaturizableWindowMask  | NSResizableWindowMask
    

    【讨论】:

      【解决方案7】:

      @JohnElemans 在上面的 accepted answer 上进行了扩展,这对我在 macOS 10.15 上使用故事板 segue 以模态方式呈现时有用:

      // On NSViewController.viewDidAppear()
      
      if let window = self.view.window {
          window.standardWindowButton(NSWindow.ButtonType.closeButton)?.isHidden = true
          window.standardWindowButton(NSWindow.ButtonType.miniaturizeButton)?.isHidden = true
          window.standardWindowButton(NSWindow.ButtonType.zoomButton)?.isHidden = true
      }
      

      我必须添加第三行 (NSWindow.ButtonType.zoomButton) 以摆脱 绿色(“全屏”)按钮。

      【讨论】:

        【解决方案8】:

        如果你正在使用 Flutter,你可以这样做:

        import Cocoa
        import FlutterMacOS
        import window_manager
        
        
        class MainFlutterWindow: NSWindow {
          override func awakeFromNib() {
            let flutterViewController = FlutterViewController.init()
            let windowFrame = self.frame
            self.contentViewController = flutterViewController
            self.setFrame(windowFrame, display: true)
          
          self.standardWindowButton(.closeButton)?.isHidden = true
          self.standardWindowButton(.miniaturizeButton)?.isHidden = true
          self.standardWindowButton(.zoomButton)?.isHidden = true
        
        
        RegisterGeneratedPlugins(registry: flutterViewController)
        
        super.awakeFromNib()
          }
        
            
          override public func order(_ place: NSWindow.OrderingMode, relativeTo otherWin: Int) {
                    super.order(place, relativeTo: otherWin)
                     hiddenWindowAtLaunch()
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2014-03-09
          • 1970-01-01
          • 2011-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多