【问题标题】:Can I disable the window resizing feature on my Mac Catalyst iOS app我可以在我的 Mac Catalyst iOS 应用程序上禁用窗口大小调整功能吗
【发布时间】:2019-07-12 19:34:55
【问题描述】:

我正在迁移我的 iOS 应用以支持 MacCatalyst,但我想防止用户调整窗口大小。

你有什么建议吗?

【问题讨论】:

  • 我也面临同样的问题。你找到解决办法了吗?
  • 不,我没有@HardikThakkar。可以限制 MacOS 应用程序的大小,但对于为 Mac 构建的 iOS 应用程序显然(目前)还没有
  • 我在这里回答了类似的问题:stackoverflow.com/questions/57388389/…
  • 这太奇怪了,因为我有相反的问题。应用无法调整大小,我想调整大小。

标签: ios macos mac-catalyst uikitformac


【解决方案1】:

自 Xcode11 Beta 5 起,UIWindowScene 类开始支持属性 sizeRestrictions

如果您将sizeRestrictions.maximumSizesizeRestrictions.minimumSize 设置为相同的值,则窗口将无法调整大小。为此,只需在您的 application:didFinishLaunchingWithOptions 方法中调用它(如果您使用的是 UIKit):

    UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
        windowScene.sizeRestrictions?.minimumSize = CGSize(width: 480, height: 640)
        windowScene.sizeRestrictions?.maximumSize = CGSize(width: 480, height: 640)
    }

如果您使用的是 SwiftUI 而不是 UIKit,您实际上应该将其添加到场景委托中的 scene(_:willConnectTo:options:)

注意:需要在 OSX 10.15 Beta 5 或更高版本中运行,否则会崩溃

【讨论】:

  • 上面的代码工作正常吗?我在上面的代码中崩溃了。
  • 我正在使用故事板进行设计。
  • 你需要最新的 10.15 Beta 5。在以前的版本中它会在上面一行崩溃
  • 这只对我有用,如果我把它放在func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { }
  • 我也一样@B.Slade。在 SceneDelegate 中工作
【解决方案2】:

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

【讨论】:

  • 谢谢!这里的 .onReceive 对我也很有效!不过,我将其换成了 .task,并将 .maximumSize 设置为等于 minimumSize。现在我有了我想要的大小的窗口:-)
【解决方案3】:

在文件 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 }
}

【讨论】:

    猜你喜欢
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2011-10-07
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多