24

How can I set the window size programmatically? I have a window in IB and I want to set the size of it in my code to make it larger.

atomikpanda
  • 1,845
  • 5
  • 33
  • 47

6 Answers6

35

Use -setFrame:display:animate: for maximum control:

NSRect frame = [window frame];
frame.size = theSizeYouWant;
[window setFrame: frame display: YES animate: whetherYouWantAnimation];

Note that window coordinates are flipped from what you might be used to. The origin point of a rectangle is at its bottom left in Quartz/Cocoa on OS X. To ensure the origin point remains the same:

NSRect frame = [window frame];
frame.origin.y -= frame.size.height; // remove the old height
frame.origin.y += theSizeYouWant.height; // add the new height
frame.size = theSizeYouWant;
// continue as before
Jonathan Grynspan
  • 43,286
  • 8
  • 74
  • 104
12

It is actually seems that +/- need to be reversed to keep window from moving on the screen:

NSRect frame = [window frame];
frame.origin.y += frame.size.height; // origin.y is top Y coordinate now
frame.origin.y -= theSizeYouWant.height; // new Y coordinate for the origin
frame.size = theSizeYouWant;
Leo
  • 790
  • 8
  • 10
7

Swift version

var frame = self.view.window?.frame
frame?.size = NSSize(width: 400, height:200)
self.view.window?.setFrame(frame!, display: true)
kj13
  • 1,765
  • 1
  • 11
  • 14
4

Use setFrame:display:animate:

[window setFrame:NSMakeRect(0.f, 0.f, 200.f, 200.f) display:YES animate:YES];
abmirayo
  • 173
  • 2
  • 15
DrummerB
  • 39,814
  • 12
  • 105
  • 142
4

Usually I want to resize the window based on the size of the content (not including the title bar):

var rect = window.contentRect(forFrameRect: window.frame)
rect.size = myKnownContentSize
let frame = window.frameRect(forContentRect: rect)
window.setFrame(frame, display: true, animate: true)
Robin Stewart
  • 3,147
  • 20
  • 29
  • How are you deriving `myKnownContentSize`? – rustyMagnet Jul 23 '19 at 08:53
  • `myKnownContentSize` is just whatever size I want for my window contents. This code snippet then makes the window itself a corresponding size that accommodates the title bar (or other future OS additions). – Robin Stewart Jul 23 '19 at 18:18
0

my two cents for swift 4.x 7 OSX:

a) do not call on viewDidLoad b) go on main queue... b) wait some time... so for example use:

private final func setSize(){
    if let w = self.view.window{
        var frame = w.frame
        frame.size = NSSize(width: 400, height: 800)
        w.setFrame(frame, display: true, animate: true)

    }
}
ingconti
  • 10,876
  • 3
  • 61
  • 48