![](/img/trans.png)
[英]How to set a default/preferred window size for a Mac Catalyst app?
[英]Mac-catalyst - minimum window size for Mac catalyst app
Mac 催化劑允許調整窗口大小,有沒有辦法為 Mac 催化劑應用程序提供最小窗口大小?
只需將以下代碼塊添加到您的application:didFinishLaunchingWithOptions
方法(對於UIKit項目)或scene(_:willConnectTo:options:)
(對於SwiftUI項目):
UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
windowScene.sizeRestrictions?.minimumSize = CGSize(width: 480, height: 640)
}
PS:您還可以在那里設置maximumSize
屬性
PS2:如果您將minimumSize
和maximumSize
設置為相同的值,則窗口大小將保持不變且無法調整大小。
這是@marcelosalloum 出色答案的擴展版本。
步驟 1.打開AppDelegate.swift
步驟 2.找到func application() ,在此處插入您的@marcelosalloum 代碼版本(或像我一樣調用您為此創建的函數)。
第 3 步。可選擇斷言您的代碼僅在具有合適 Swift API 的平台上運行(使用#available )
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
addWindowSizeHandlerForMacOS()
return true
}
func addWindowSizeHandlerForMacOS() {
if #available(iOS 13.0, *) {
UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
windowScene.sizeRestrictions?.minimumSize = CGSize(width: 800, height: 1100)
windowScene.sizeRestrictions?.maximumSize = CGSize(width: 800, height: 1100)
}
}
}
在我的應用程序中,我從第 23 行開始定義了一個名為addWindowSizeHandlerForMacOS()的函數。然后我從AppDelegate.swift 中的application()調用它(第 18 行)。
使用此方法實現 Objective-C 類:
- (void)setMinimumSize:(CGSize)size {
id app = NSClassFromString(@"NSApplication");
id shared = [app valueForKeyPath:@"sharedApplication"];
id mainWindow = [shared valueForKeyPath:@"mainWindow"];
NSValue *nssize = [NSValue valueWithCGSize:size];
[mainWindow setValue:nssize forKeyPath:@"minSize"];
}
從 Swift 調用 - 使用橋接頭。
在您的場景委托中,您可以執行以下操作:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let scene = (scene as? UIWindowScene) else { return }
#if targetEnvironment(macCatalyst)
scene.sizeRestrictions?.minimumSize = CGSize(width: 800, height: 1100)
scene.sizeRestrictions?.maximumSize = CGSize(width: 1280, height: 1200)
#endif
}
@marcelosalloum 答案的 Objective-C 版本:
for (UIScene* scene in UIApplication.sharedApplication.connectedScenes) {
if ([scene isKindOfClass:[UIWindowScene class]]) {
UIWindowScene* windowScene = (UIWindowScene*) scene;
windowScene.sizeRestrictions.minimumSize = CGSizeMake(480, 640);
}
}
只需將此添加到您的場景委托中:
window?.windowScene?.sizeRestrictions?.minimumSize = CGSize(width: 900.0, height: 750.0)
我還添加了如何將最大大小設置為最大可能值:
window?.windowScene?.sizeRestrictions?.maximumSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)
使用sizeRestrictions?.minimumSize
或sizeRestrictions?.maximumSize
為您的 Mac 應用程序窗口設置最小或最大大小。
打開您的SceneDelegate
並:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let scene = (scene as? UIWindowScene) else { return }
scene.sizeRestrictions?.minimumSize = CGSize(width: 800, height: 600)
scene.sizeRestrictions?.maximumSize = CGSize(width: 800, height: 600)
}
我做了一個小調查。 所以我在我的 SceneDelegate 的 func 場景中添加了以下內容:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if UIDevice.current.systemName.contains("Mac") {
window?.windowScene?.sizeRestrictions?.minimumSize = CGSize(width: 1024, height: 768)
} else {
// iOS - nothing to change
}
我不確定是否需要系統名稱子句,因為對於 iOS,window.windowScene.sizeRestrictoins 為零,但添加了這個是為了清楚地理解和可能的未來更新。
我選擇 1024x768 作為最小的 iPad 橫向尺寸(Catalyst 將設備報告為 Mac OS 橫向模式下的 iPad)
if isMacCatalyst() {
UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
windowScene.sizeRestrictions?.minimumSize = CGSize(width: 600, height: 896)
}
}
public func isMacCatalyst() -> Bool {
#if targetEnvironment(macCatalyst)
return true
#else
return false
#endif
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.