I have a NSViewController
named Hardness
, and I need not to let user resize it. Of course, I can just resize it back every time the users tries, but is there any way just not to let user open a window to full screen, or to stretch the window?
edit/update: Xcode 10.2 • Swift 5
NSWindow has a property called styleMask that allows you to control what kinds of control will be available to the user. If you don't want to allow the user to resize the window you have to remove the style mask .resizable using the mutating method remove(member: NSWindowStyleMask)
. To enable it again you need to use the mutating method insert(member: NSWindowStyleMask)
. Note that it will also disable the full screen mode for that window:
removing to disable:
window.styleMask.remove(.resizable)
inserting to enable
window.styleMask.insert(.resizable)
Sample
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var closable: NSButton!
@IBOutlet weak var miniaturizable: NSButton!
@IBOutlet weak var resizable: NSButton!
@IBOutlet weak var titled: NSButton!
lazy var window: NSWindow! = self.view.window
func remove(_ member: NSWindow.StyleMask) {
window.styleMask.remove(member)
}
func insert(_ member: NSWindow.StyleMask) {
window.styleMask.insert(member)
}
@IBAction func toggle(_ sender: NSButton) {
switch sender.state {
case .on:
switch sender {
case closable: insert(.closable)
case miniaturizable: insert(.miniaturizable)
case resizable: insert(.resizable)
case closable: insert(.closable)
case titled: insert(.titled)
default: break
}
case .off:
switch sender {
case closable: remove(.closable)
case miniaturizable: remove(.miniaturizable)
case resizable: remove(.resizable)
case closable: remove(.closable)
case titled: remove(.titled)
default: break
}
default: break
}
}
}
window.styleMask = [.closable, .titled, .miniaturizable] //Swift 3
–
Therapist I solved the same issue with the non-resizable window by one line of code in
override func viewDidAppear() {
self.view.window?.styleMask.remove(NSWindowStyleMask.Resizable)
}
The correct approach would be to use bitwise operators.
Disable resize:
window?.styleMask &= ~NSResizableWindowMask
Enable resize:
window?.styleMask |= NSResizableWindowMask
Binary operator '|=' cannot be applied to two 'NSWindowStyleMask' operands
–
Staphylococcus window?.styleMask = NSWindowStyleMask(rawValue: (NSWindowStyleMask.closable.rawValue | NSWindowStyleMask.titled.rawValue))
–
Continuo window?.styleMask.update(with: NSWindowStyleMask.resizable)
. –
Cuirassier This answer may be of some help in addition to the current one. There's also a nice simple way to accomplish this by using setHidden
with NSWindowZoomButton
Setup the functionality as a sub-class of NSWindow
:
Objective-C
#import "CustomWindow.h"
@implementation CustomWindow
- (void)awakeFromNib {
NSButton *zoomButton = [self standardWindowButton:NSWindowZoomButton];
[zoomButton setHidden:YES];
}
@end
Swift
import CustomWindow
class CustomWindow {
func awakeFromNib() {
var zoomButton: NSButton = self.standardWindowButton(NSWindowZoomButton)
zoomButton.setHidden(true)
}
}
Connect the custom class to your window in IB and the Zoom
button should be now hidden!
self.standardWindowButton(NSWindowButton.CloseButton)?.hidden = true
... I think apple changed it up a bit since I answered this question originally. –
Happiness A little more elegant solution for Swift 3, so that the | operator can be used:
public func | (left: NSWindowStyleMask, right: NSWindowStyleMask) -> NSWindowStyleMask {
return NSWindowStyleMask(rawValue: left.rawValue | right.rawValue)
}
For those using SwiftUI, who don't have access to viewDidAppear
, you can do this in your app delegate to disable window resizing for all windows:
final class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ notification: Notification) {
NSApp.windows.forEach { $0.styleMask.remove(.resizable) }
}
}
(And, of course, you can filter NSApp.windows
if you want to apply this to a single window.)
© 2022 - 2024 — McMap. All rights reserved.
self.view.window?.styleMask = NSClosableWindowMask | NSTitledWindowMask | NSMiniaturizableWindowMask
and that didn't work – Frisby