不可调整大小的窗口 swift

问题描述 投票:0回答:6

我有一个名为

NSViewController
Hardness
,我不需要让用户调整它的大小。当然,我可以在用户每次尝试时将其大小调整回来,但是有什么办法不让用户将窗口打开到全屏,或者拉伸窗口吗?

macos swift nswindow window-resize nsviewcontroller
6个回答
23
投票

编辑/更新:Xcode 10.2 • Swift 5

NSWindow 有一个名为 styleMask 的属性,它允许您控制用户可以使用哪些类型的控件。如果您不想允许用户调整窗口大小,则必须使用变异方法

remove(member: NSWindowStyleMask)
删除样式掩码 .ressized。要再次启用它,您需要使用变异方法
insert(member: NSWindowStyleMask)
。请注意,它还将禁用该窗口的全屏模式:


删除以禁用:

window.styleMask.remove(.resizable)

插入启用

window.styleMask.insert(.resizable)

样品

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
        }
    }
}

示例项目


12
投票

我通过

中的一行代码解决了与不可调整大小的窗口相同的问题
override func viewDidAppear() {
    self.view.window?.styleMask.remove(NSWindowStyleMask.Resizable)
}

6
投票

正确的方法是使用按位运算符

禁用调整大小:

window?.styleMask &= ~NSResizableWindowMask

启用调整大小:

window?.styleMask |= NSResizableWindowMask

2
投票

除了当前答案之外,这个答案可能还有一些帮助。还有一种简单的方法可以通过使用

setHidden
NSWindowZoomButton

来实现此目的

将功能设置为

NSWindow
的子类:

Objective-C

#import "CustomWindow.h"

@implementation CustomWindow

- (void)awakeFromNib {

NSButton *zoomButton = [self standardWindowButton:NSWindowZoomButton];
[zoomButton setHidden:YES];

}

@end

斯威夫特

import CustomWindow

class CustomWindow {

    func awakeFromNib() {
        var zoomButton: NSButton = self.standardWindowButton(NSWindowZoomButton)
        zoomButton.setHidden(true)
    }
}

将自定义类连接到 IB 中的窗口,并且

Zoom
按钮现在应该隐藏!


2
投票

Swift 3 的一个更优雅的解决方案,以便 |可以使用运算符:

public func | (left: NSWindowStyleMask, right: NSWindowStyleMask) -> NSWindowStyleMask {
    return NSWindowStyleMask(rawValue: left.rawValue | right.rawValue)
}

0
投票

对于那些使用 SwiftUI 且无法访问

viewDidAppear
的用户,您可以在应用程序委托中执行此操作,以禁用所有窗口的窗口大小调整:

final class AppDelegate: NSObject, NSApplicationDelegate {
    func applicationDidFinishLaunching(_ notification: Notification) {
        NSApp.windows.forEach { $0.styleMask.remove(.resizable) }
    }
}

(当然,如果您想将其应用于单个窗口,您可以过滤

NSApp.windows
。)

© www.soinside.com 2019 - 2024. All rights reserved.