Masquer NSWindow barre de titre
y a-t-il un moyen de cacher le titlebar dans un NSWindow? Je ne veux pas complètement écrire une nouvelle fenêtre personnalisée. Je ne peux pas utiliser NSBorderlessWindowMask parce que j'ai une barre du bas sur ma fenêtre, et utiliser NSBorderlessWindowMask fait que disparaître. J'ai également essayé d'utiliser setContentBorderThickness: forEdge: avec NSMaxYEdge et le réglage à 0, qui n'a pas fonctionné non plus.
Toute aide est appréciée
7 réponses
à partir de OS X 10.10, vous pouvez masquer la barre de titre.
window1.titlebarAppearsTransparent = true
window1.titleVisibility = .Hidden
peut-être que vous voulez Outrepasser le style de fenêtre.
window1.styleMask = NSResizableWindowMask
| NSTitledWindowMask
| NSFullSizeContentViewWindowMask
Qu'advient-il si vous obtenez le superview du bouton fermer? Pouvez-vous vous cacher?
// Imagine that 'self' is the NSWindow derived class
NSButton *miniaturizeButton = [self standardWindowButton:NSWindowMiniaturizeButton];
NSView* titleBarView = [miniaturizeButton superview];
[titleBarView setHidden:YES];
la seule façon que je sais serait de créer une fenêtre sans barre de titre (voir NSBorderlessWindowMask). Notez que vous ne pouvez pas (facilement) créer une fenêtre sans barre de titre de l'IB, de sorte que vous aurez à faire un peu de travail dans le code (il y en a un quelques approches différentes, vous pouvez probablement le comprendre).
un gros inconvénient avec l'utilisation d'une fenêtre sans barre de titre est que vous êtes maintenant sur le crochet pour beaucoup plus de l'apparence standard et le comportement-coins arrondis et tel.
j'ai fait l'expérience que lorsque j'ai d'abord défini content view de ma fenêtre et que j'ai ensuite défini window borderless:
[yourWindow setStyleMask:NSBorderlessWindowMask];
Rien n'apparaît dans ma fenêtre. Donc j'ai d'abord défini le masque de style et après cela j'ai défini la vue de contenu:
- (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's content view
[self.window.contentView addSubview:self.masterViewController.view];
self.masterViewController.view.frame = ((NSView*)self.window.contentView).bounds;
}
en quelque sorte écran d'Accueil NSWindow / NSViewController setup (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)
}
}
}
Résultat