2017-05-25 1 views
0

je tente de créer une fenêtre OS X programme comme ci-dessous:Sous OS X, comment obtenir correctement la taille de la fenêtre?

print("creating window frame=\(winFrame)") 

let window = NSWindow(contentRect: winFrame, styleMask: [NSWindowStyleMask.resizable, NSWindowStyleMask.closable, NSWindowStyleMask.miniaturizable, NSWindowStyleMask.titled], backing: NSBackingStoreType.buffered, defer: false) 

print("after window frame=\(window.frame)") 

Je me attendais à ces deux sorties devrait être la même, est cependant ici la sortie

creating window frame=(1556.0, 193.0, 421.0, 646.0) 
after window frame=(1556.0, 193.0, 421.0, 668.0) 

La différence est que la hauteur est passé de 646 à 668.

Pourquoi y a-t-il une telle différence et comment obtenir le bon nombre?

Répondre

1

La fenêtre contentRect est le rect, en coordonnées d'écran globales, devant être occupé par le contentView de la fenêtre. Ce rect n'inclut pas la barre de titre de la fenêtre. La fenêtre frameinclut la barre de titre.

Si vous avez un cadre de fenêtre désirée, vous pouvez calculer le rect contenu correspondant, puis utilisez le rect de contenu pour créer la fenêtre:

let winFrame = ... 
let styleMask: NSWindowStyleMask = [.resizable, .closable, .miniaturizable, .titled] 
let contentRect = NSWindow.contentRect(forFrameRect: winFrame, styleMask: styleMask) 
let window = NSWindow(contentRect: contentRect, styleMask: styleMask, backing: .buffered, defer: false) 

Ou vous pouvez simplement définir le cadre de la fenêtre après l'avoir créé, comme ceci:

let winFrame = ... 
let styleMask: NSWindowStyleMask = [.resizable, .closable, .miniaturizable, .titled] 
let window = NSWindow(contentRect: .zero, styleMask: styleMask, backing: .buffered, defer: false) 
window.setFrame(winFrame, display: true) 
+0

Merci! Les deux solutions sont géniales! Pour l'instant j'ai choisi la deuxième solution. –

1

Lors de la création du NSWindow vous définissez la contentRect qui est pas le cadre.

Un objet NSWindow est définie par un rectangle d'encadrement qui entoure la fenêtre entière, y compris la barre de titre, la frontière, et d'autres éléments périphériques (telles que le contrôle de redimensionnement), et par un rectangle de contenu qui entoure tout son contenu région.

- A partir de la page How Windows Work sur le Guide de programmation de la fenêtre

Vous obtenez la taille d'image correcte de la fenêtre. Soit vous voulez en créer un plus petit en passant dans un plus petit contentRect ou vous voulez accéder à la propriété contentView.frame.