center programmatically created window
extension NSWindow {
public func setFrameOriginToPositionWindowInCenterOfScreen() {
if let screenSize = screen?.frame.size {
self.setFrameOrigin(NSPoint(x: (screenSize.width-frame.size.width)/2, y: (screenSize.height-frame.size.height)/2))
}
}
}
Objective - C in macOS Catalina , Version 10.15.3
more readable @Wekwa's answer
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSWindow * window = NSApplication.sharedApplication.windows[0];
CGFloat xPos = NSWidth(window.screen.frame)/2 - NSWidth(window.frame)/2;
CGFloat yPos = NSHeight(window.screen.frame)/2 - NSHeight(window.frame)/2;
[window setFrame:NSMakeRect(xPos, yPos, NSWidth(window.frame), NSHeight(window.frame)) display:YES];
}
CGFloat xPos = NSWidth([[window screen] frame])/2 - NSWidth([window frame])/2;
CGFloat yPos = NSHeight([[window screen] frame])/2 - NSHeight([window frame])/2;
[window setFrame:NSMakeRect(xPos, yPos, NSWidth([window frame]), NSHeight([window frame])) display:YES];
This puts it at the literal center of the screen, not taking into account the space occupied by the dock and menu bar. If you want to do that, change [[window screen] frame]
to [[window screen] visibleFrame]
.
The question should probably be why [window center]
does not work; but assuming that is the case use NSScreen
to get the screen coordinates, do the math, and center the window directly.