将SwiftUI View作为UISplitViewController主视图时的绘制异常问题
问题原因及解决方案
问题根源
- 约束锚点不统一:你给UIHostingController视图设置约束时,左右锚点对齐了
safeAreaLayoutGuide,但上下锚点直接绑定到控制器的view,这种混用在iPad竖屏(存在导航栏安全区域)场景下,会导致布局错位,出现叠加层。 - 视图延伸行为冲突:默认情况下
UIViewController的edgesForExtendedLayout会让视图延伸到导航栏、状态栏下方,和UIHostingController的布局叠加后引发异常显示。
修复步骤
- 统一约束到安全区域
修改PrimaryViewController中的约束代码,将上下锚点也对齐到safeAreaLayoutGuide:
NSLayoutConstraint.activate([ testVC.view.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor ), testVC.view.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor ), testVC.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor ), testVC.view.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor ), ])
- 禁用视图延伸到导航栏区域
在viewDidLoad中添加一行代码,阻止PrimaryViewController的视图延伸到导航栏下方:
self.edgesForExtendedLayout = []
- 可选简化方案
如果不需要额外的PrimaryViewController逻辑,可直接在Storyboard中将导航控制器的根视图替换为UIHostingController,并关联你的Tile_SwiftUI,能直接避免容器控制器的布局冲突。
内容的提问来源于stack exchange,提问作者reza23
相关产品推荐
相关产品推荐

