Можно ли отключить функцию изменения размера окна в моем приложении UiKitForMac для iOS?

Я перевожу свое приложение iOS для поддержки UIKitForMac, но я бы хотел предотвратить изменение размера окна пользователем.

Есть ли у вас какие-либо советы по этому поводу?

5 ответов

Решение

Согласно @Adam, Xcode Beta 5 (+ OSX 10.15 Beta 5) теперь поддерживает свойство sizeRestrictions в UIWindowScene,

Если вы установите sizeRestrictions.maximumSize а также sizeRestrictions.minimumSize к тому же значению окно не будет изменяемого размера:

windowScene.sizeRestrictions?.minimumSize = CGSize(width: 640, height: 480)
windowScene.sizeRestrictions?.maximumSize = CGSize(width: 640, height: 480)

Примечание: вам нужно запустить это в OSX 10.15 Beta 5 или более поздней версии, в противном случае произойдет сбой

В жизненном цикле приложения SwiftUI это сработало для меня:

      import SwiftUI

@main
struct MyApp: App {

  @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
  
  var userSettings = UserSettings()
  
  var body: some Scene {
    WindowGroup {
      ContentView()
        .environmentObject(userSettings)
        .environmentObject(KeyboardManager())
        .onOpenURL(perform: { url in
          let verificationCode = url.lastPathComponent
          log.info(" Verification Code: \(verificationCode)")
          userSettings.verificationCode = verificationCode
        })
      .onReceive(NotificationCenter.default.publisher(for: UIScene.willConnectNotification)) { _ in
        #if targetEnvironment(macCatalyst)
        // prevent window in macOS from being resized down
          UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
            windowScene.sizeRestrictions?.minimumSize = CGSize(width: 800, height: 1000)
          }
        #endif
      }
    }
  }
}

для цели-C попробуйте

      for (UIScene* scene in UIApplication.sharedApplication.connectedScenes) {
    if ([scene isKindOfClass:[UIWindowScene class]]) {
        UIWindowScene* windowScene = (UIWindowScene*) scene;
        windowScene.sizeRestrictions.minimumSize = CGSizeMake(480, 640);
    }
}

Стив дал мне ответ. Также добавьте отключение полноэкранного режима

      WindowGroup {
    ContentView()
    .onReceive(NotificationCenter.default.publisher(for: UIScene.willConnectNotification)) { _ in
        #if targetEnvironment(macCatalyst)
        // prevent window in macOS from being resized down
        UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
            windowScene.sizeRestrictions?.minimumSize = CGSize(width: 800, height: 1000)
            windowScene.sizeRestrictions?.maximumSize = CGSize(width: 800, height: 1000)
            windowScene.sizeRestrictions?.allowsFullScreen = false
        }
        #endif
    }
}

В файле SceneDelegate.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).
    UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
        windowScene.sizeRestrictions?.minimumSize = CGSize(width: 1268, height: 880)
        windowScene.sizeRestrictions?.maximumSize = windowScene.sizeRestrictions!.minimumSize
    }
    
    guard let _ = (scene as? UIWindowScene) else { return }
}
Другие вопросы по тегам