Скрыть строку заголовка NSWindow

Есть ли способ скрыть заголовок в NSWindow? Я не хочу полностью писать новое пользовательское окно. Я не могу использовать NSBorderlessWindowMask, потому что у меня есть нижняя панель в моем окне, и использование NSBorderlessWindowMask заставляет это исчезнуть. Я также попытался использовать setContentBorderThickness: forEdge: с NSMaxYEdge и установив его в 0, это тоже не сработало.

Любая помощь приветствуется

Ответы

Ответ 1

[yourWindow setStyleMask:NSBorderlessWindowMask];

Ответ 2

Начиная с OS X 10.11, вы можете скрыть строку заголовка.

        window1.titlebarAppearsTransparent  =   true
        window1.titleVisibility             =   .Hidden

Возможно, вы хотите переопределить стиль окна.

        window1.styleMask                   =   NSResizableWindowMask
                                            |   NSTitledWindowMask
                                            |   NSFullSizeContentViewWindowMask

Ответ 3

Что произойдет, если вы получите представление о кнопке закрытия? Вы можете скрыть это?

// Imagine that 'self' is the NSWindow derived class
NSButton *miniaturizeButton = [self standardWindowButton:NSWindowMiniaturizeButton];
NSView* titleBarView = [miniaturizeButton superview];
[titleBarView setHidden:YES];

Ответ 4

Единственный способ, которым я знаю, - создать окно без заголовка (см. NSBorderlessWindowMask). Обратите внимание: вы не можете (легко) создать окно без titlebar в IB, поэтому вам придется немного поработать над кодом (есть пара различных подходов, вы, вероятно, можете понять это).

Большой недостаток с использованием окна без заголовка - это то, что вы сейчас находитесь на крючок для большей части стандартного внешнего вида и поведения - закругленные углы и т.д.

Ответ 5

У меня возникло ощущение, что когда я впервые установил представление содержимого своего окна, а затем установил окно без полей:

[yourWindow setStyleMask:NSBorderlessWindowMask];

Ничего не появится в моем окне. Поэтому я сначала установил маску стиля, и после этого я установил представление содержимого:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{ 
    // 1. borderless window
    [[self window] setStyleMask: NSBorderlessWindowMask];
    // 2. create the master View Controller
    self.masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];
    // 3. Add the view controller to the Window content view
    [self.window.contentView addSubview:self.masterViewController.view];
    self.masterViewController.view.frame = ((NSView*)self.window.contentView).bounds;     
}

И вуаля, содержимое моего окна появилось.

Ответ 6

Вы можете использовать WAYInAppStoreWindow, доступный в GitHub, который работает на Yosemite и Mavericks.

Ответ 7

Вид экрана приветствия Настройка NSWindow/NSViewController (Swift 4.1)

extension NSWindow {

   enum Style {
      case welcome
   }

   convenience init(contentRect: CGRect, style: Style) {
      switch style {
      case .welcome:
         let styleMask: NSWindow.StyleMask = [.closable, .titled, .fullSizeContentView]
         self.init(contentRect: contentRect, styleMask: styleMask, backing: .buffered, defer: true)
         titlebarAppearsTransparent = true
         titleVisibility = .hidden
         standardWindowButton(.zoomButton)?.isHidden = true
         standardWindowButton(.miniaturizeButton)?.isHidden = true
      }
   }
}

class WelcomeWindowController: NSWindowController {

   private (set) lazy var viewController = WelcomeViewController()
   private let contentWindow: NSWindow

   init() {
      contentWindow = NSWindow(contentRect: CGRect(x: 400, y: 200, width: 800, height: 472), style: .welcome)
      super.init(window: contentWindow)

      let frameSize = contentWindow.contentRect(forFrameRect: contentWindow.frame).size
      viewController.view.setFrameSize(frameSize)
      contentWindow.contentViewController = viewController
   }
}

class WelcomeViewController: NSViewController {

   private lazy var contentView = View()

   override func loadView() {
      view = contentView
   }

   init() {
      super.init(nibName: nil, bundle: nil)
   }

   override func viewDidLoad() {
      super.viewDidLoad()
      contentView.backgroundColor = .white
   }
}

class View: NSView {

   var backgroundColor: NSColor?

   convenience init() {
      self.init(frame: NSRect())
   }

   override func draw(_ dirtyRect: NSRect) {
      if let backgroundColor = backgroundColor {
         backgroundColor.setFill()
         dirtyRect.fill()
      } else {
         super.draw(dirtyRect)
      }
   }
}

Результат

Стиль экрана приветствия NSWindow