UIHostingController 在某些条件下不会调整自动旋转大小

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

我看到

UIHostingController
托管着一个以模态方式呈现的 SwiftUI 视图。我看到的问题是,如果
modalPresentationStyle
设置为
overCurrentContext
,它不会在自动旋转时调整大小。

  let promptHostingController = UIHostingController(rootView: promptView)
  promptHostingController.isModalInPresentation = true
  promptHostingController.overrideUserInterfaceStyle = .dark
  promptHostingController.modalPresentationStyle = .overCurrentContext
  self.present(promptHostingController, animated: animated)

将其设置为任何其他值(例如

overFullScreen
)可以解决该问题。购买想知道为什么它无法通过
overCurrentContext
调整大小?

ios swiftui uikit autorotate uihostingcontroller
1个回答
0
投票

overCurrentContext
的文档中没有任何内容表明所呈现的视图将调整大小以适合整个屏幕。它根本没有提及任何有关所呈现视图的大小的信息:

一种呈现样式,其中内容显示在另一个视图控制器的内容上。

文档还说:

因此,如果呈现的视图控制器没有用不透明内容填充屏幕,则底层内容会显示出来。

这里的情况正是如此 - 您没有编写在屏幕旋转时调整视图大小的代码,因此设备旋转后视图“不会填充屏幕”(更不用说“不透明内容”)。

然而,

overFullScreen
的文档确实说它将“覆盖”整个屏幕。

一种视图呈现样式,其中呈现的视图覆盖屏幕。

注意这里不同的词语选择 - “覆盖”而不是“超过”。


无论如何,如果你希望它覆盖

definesPresentationContext
的视图控制器,你可以自己向视图添加自动布局约束。

// here I'm assuming "view" is the view you want to cover
let host = UIHostingController(rootView: ...)
host.modalPresentationStyle = .overCurrentContext
host.sizingOptions = [.intrinsicContentSize]
host.presentationController?.delegate = self
host.view.translatesAutoresizingMaskIntoConstraints = false
present(host, animated: true) { [self] in
    NSLayoutConstraint.activate([
        host.view.leftAnchor.constraint(equalTo: view.leftAnchor),
        host.view.rightAnchor.constraint(equalTo: view.rightAnchor),
        host.view.topAnchor.constraint(equalTo: view.topAnchor),
        host.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
    ])
}

您应该在呈现托管控制器之后添加约束,这就是为什么我将

NSLayoutConstraint.activate
放在
present
的完成处理程序中。在此之前,所呈现的视图尚未在视图层次结构中。

此外,使用

intrinsicContentSize
作为尺寸选项。正如其文档所述,当您使用 AutoLayout 布局托管视图时,应该使用它。

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