如何在MacCatalyst上禁用全屏按钮

奥列格·拜达卡(Oleg Baidalka)

macCatalyst上的UIWindow,带有关闭,最小化和全屏按钮

目前,我要停止调整窗口大小:

#if targetEnvironment(macCatalyst)
windowScene.sizeRestrictions?.minimumSize = CGSize(width: 480, height: 900)
windowScene.sizeRestrictions?.maximumSize = CGSize(width: 480, height: 900)
#endif

let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()

全屏按钮仍然使其全屏显示。

他的脾气

这有点复杂,但可能。这是一种方法(我删除了所有目标宏以简化发布)。

结果:

在此处输入图片说明

码:

// on next event after UIWindow has made key it is possible to find NSWindow in runtime

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        ...
        window.makeKeyAndVisible()

        DispatchQueue.main.async { // < wait for NSWindow available
            SilentBridge.disableCloseButton(for: self.nsWindow(from: window))
        }
    }

// added helper function to SceneDelegate to find NSWindow

    func nsWindow(from window: UIWindow) -> NSObject? {
        guard let nsWindows = NSClassFromString("NSApplication")?.value(forKeyPath: "sharedApplication.windows") as? [NSObject] else { return nil }
        for nsWindow in nsWindows {
            let uiWindows = nsWindow.value(forKeyPath: "uiWindows") as? [UIWindow] ?? []
            if uiWindows.contains(window) {
                return nsWindow
            }
        }
        return nil
    }

首选Objective-C部分(使用未声明的选择器更简单)。通过Xcode模板添加新的Objective-C类,并确认创建网桥。之后,需要在生成的类头文件下面添加它,*-Bridging-Header.h并且所有文件都应该工作。

// SilentBridge.h

@import Foundation;

@interface SilentBridge : NSObject
+ (void)disableCloseButtonFor:(NSObject  * _Nullable)window;
@end

// SilentBridge.m

#import "SilentBridge.h"
@import Foundation;

// Forward declarations to allow direct calls in below method
@interface NSObject(SilentBridge) 
- (id)standardWindowButton:(NSInteger)value;
- (void)setEnabled:(BOOL)flag;
@end

@implementation SilentBridge

+ (void)disableCloseButtonFor:(NSObject *)window {
    if ([window respondsToSelector:@selector(standardWindowButton:)]) {
        id closeButton = [window standardWindowButton:2];
        if ([closeButton respondsToSelector:@selector(setEnabled:)]) {
            [closeButton setEnabled:NO];
        }
    }
}
@end

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在全屏上禁用Firefox地址栏动画?

Eclipse SWT如何在MacOS 10.10 Yosemite的Shell上禁用“全屏”

如何在某些屏幕上禁用android后退按钮

如何在禁用按钮上启用Bootstrap工具提示?

如何在平板电脑上禁用Windows按钮?

如何在textchanged事件上阻止或禁用按钮的回发?

如何在动态呈现的表单上禁用登录按钮

在react-player中,如何禁用“全屏”按钮?

如何在那边的按钮上添加全屏自定义相机视图,例如:snapchat

如何禁用 Bootstrap 上的按钮?

如何在angular2中更改按钮文本并在单击事件上禁用按钮

在Winform C#中禁用按钮时如何在按钮上设置焦点?

如何在 Firefox 中禁用“网站现在全屏”警告?

如果用户单击该行上的折叠按钮,如何在整行上禁用 onclick?

如何在移动浏览器的嵌入式Vimeo播放器上显示全屏按钮?

电子:将'fullscreen'标志设置为false不会在macOS上禁用全屏按钮

如何在所有类型的浏览器中禁用HTML 5 Video Player全屏按钮,尤其是在IE,Edge和Firefox,Opera,Safari中?

如何禁用ASP按钮上的回发

如何禁用页面加载上的按钮?

如何禁用或启用angularjs上的按钮?

如何启用或禁用表单上的按钮?

单击div中的按钮时如何在div上禁用matRipple?

React Native Navigation:如何在模式上禁用后退按钮?

如何在Dell笔记本电脑上禁用Trackpoint鼠标指针(小按钮鼠标)?

如何在javaFx中禁用pdf阅读器上的加载按钮

如何在远程表单上保持禁用提交按钮,直到加载下一页

如何在Xamarin Forms(UWP)上禁用调整大小(最大化/最小化)按钮?

如何在javascript中的禁用按钮上启用工具提示?

如何在Ubuntu 20LTS上禁用电源按钮的行为