-[NSWindow setResizable:(BOOL)]
does not exist. But, here is a way to get that effect as long as the window was resizable when created. (I don’t know of a way to make a window resizeable if it was first created unresizeable).
The basic idea is to show/hide the resizing controls, and implement delegate functions that prevent the window from being resized when the resizing controls are hidden.
//show or hide hide the window's resizing controls: [[window standardWindowButton:NSWindowZoomButton] setHidden:!resizable]; [window setShowsResizeIndicator:resizable];
Note that setShowsResizeIndicator:
only shows/hides the resize-indicator in the lower-right of the window. It will not make the window non-resizeable.
To keep the window from being resized when showsResizeIndicator
is false, implement the delegate methods:
- (NSSize)windowWillResize:(NSWindow *) window toSize:(NSSize)newSize { if([window showsResizeIndicator]) return newSize; //resize happens else return [window frame].size; //no change } - (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame { //let the zoom happen iff showsResizeIndicator is YES return [window showsResizeIndicator]; }
No Delegate Hack
Finally, there is a hack that avoids using delegate methods, although I don’t recommend it.
[[window standardWindowButton:NSWindowZoomButton] setHidden:!resizable]; [window setShowsResizeIndicator:resizable]; CGFloat resizeIncrements = resizable ? 1 : MAXFLOAT; [window setResizeIncrements:NSMakeSize(resizeIncrements, resizeIncrements)];
setResizeIncrements
“Restricts the user’s ability to resize the receiver so the width and height change by multiples of width and height increments.” So setting it to MAXFLOAT x MAXFLOAT
means that the user can’t resize the window, because they won’t have a big enough screen. Note that this won’t disable the “zoom” function, although the user probably couldn’t use it with the zoom button hidden.
This approach uses slightly fewer lines of code, but it is more brittle and indirect, since it depends on the screen-size, not if the window is (visibly) resizeable. I wouldn’t use it over delegates. But here it is.