为何UIHostingController设为overCurrentContext时旋转不自动调整大小?
核心原因
overCurrentContext 这类非全屏叠加模态,和 overFullScreen 这类全屏模态的展示上下文机制完全不同,导致系统不会自动为它处理旋转后的尺寸更新:
全屏模态(如overFullScreen)的逻辑:
使用overFullScreen时,模态控制器会完全接管整个屏幕的展示控制权,成为当前的顶级活跃控制器。系统会自动把设备旋转、布局更新的事件全量传递给它,触发viewWillTransition(to size:)这类布局生命周期方法。UIHostingController收到这些事件后,会自动通知内部的SwiftUI视图重新计算布局,所以旋转时能自动调整大小。overCurrentContext的逻辑:
overCurrentContext的设计是让模态控制器叠加在原有控制器视图之上(原控制器视图仍然可见),它的初始尺寸是在调用present时,基于当时父控制器的视图尺寸确定的。关键在于,屏幕的旋转响应仍然由原来的控制器负责,系统不会把旋转后的布局更新事件主动传递给这个叠加的模态控制器——它不在系统自动布局更新的流程里。
结合UIHostingController的特性
UIHostingController是UIKit和SwiftUI的桥接层,它依赖UIKit的布局生命周期事件来通知SwiftUI视图更新尺寸。当使用overCurrentContext时,UIHostingController收不到系统发送的旋转布局事件,内部的SwiftUI视图感知不到尺寸变化,自然不会自动调整大小。
补充说明
如果手动给overCurrentContext的UIHostingController加旋转监听(比如监听UIDeviceOrientationDidChangeNotification),然后手动更新它的view.frame,也能实现旋转调整,但这需要自己写代码处理,不像全屏模态那样由系统自动完成。
内容的提问来源于stack exchange,提问作者Deepak Sharma

