问题描述
有人知道怎么处理吗?似乎当您有一个带有 NavigationView 的 UIHostingController 时,会发生以下情况:
注意大的灰色标签栏安全区域。
这主要是一个 UIKit 应用程序。正在使用 swiftUI 视图替换选项卡栏中的选项卡。
这是我的代码:
var body: some View {
NavigationView {
ZStack {
MapKitMapView(
mapView: mapView,annotations: $annotations,polylines: $polylines,centerCoordinate: $centerCoordinate,newMapRegion: $newMapRegion,userTrackingMode: $userTrackingMode
)
.edgesIgnoringSafeArea(.all)
.frame(maxWidth: .infinity,maxHeight: .infinity,alignment: .center)
ButtonLayer(mapView: mapView,userTrackingMode: $userTrackingMode,showSheet: $showSheet)
.frame(maxWidth: .infinity,maxHeight: .infinity)
.padding(.margin)
}
.edgesIgnoringSafeArea(.all)
.navigationBarHidden(true)
.sheet(isPresented: $showSheet) {
SettingsView()
}
}
}
请原谅审查制度。我希望应用保持匿名。
但基本上我的 UITabBar 是这样构建的:
- 有一个全局的 UINavigationViewController
- UINavigationController 中的第一个也是唯一一个项目是这个 UITabBar
- UITabBar 选项卡都是以编程方式创建的。
- 有问题的选项卡只是一个 UIHostingController,上面的代码是您在上面看到的 rootView。
我尝试手动为 UIHostingController 设置额外的安全区域插入,以使其扩展到安全区域之外。
如果我删除 NavigationView,一切都会按预期进行。
解决方法
我找到了解决此问题的方法。但是,我想使用纯 swiftUI 解决方案,而不是以下解决方法。所以我将这个问题保持开放,看看其他人是否有其他见解。
在检查视图层次结构调试器时,我注意到以下几点:
导航视图样式是 SplitView... 这是一种 iPad 样式。我实际上并没有设定我的风格。所以也许是一个错误导致它默认为那个。
我尝试将 NavigationView 样式更改为 StackNavigationViewStyle()。
虽然这没有解决问题,但它确实清理了视图层次结构并将我的 UIHostingViewController 包装在适当的 UINavigationController 中。
它还将底部灰色的“安全区域”更改为白色。
这告诉我的是,当 NavigationView 在 UIHostingController 中使用时,它只是将您的视图包装在标准 UINavigationController 中。而且由于我与 UIKit 交互,因此将标签栏的根设置为 UINavigationController 而不是 UIHostingController 并在其中设置 NavigationView 可能更有意义。
因此,遇到问题的选项卡现在填充了:
UINavigationController(rootViewController: UIHostingController(rootView: MyView()))
而我的视图代码只是:
ZStack {
MapKitMapView(
mapView: mapView,annotations: $annotations,polylines: $polylines,centerCoordinate: $centerCoordinate,newMapRegion: $newMapRegion,userTrackingMode: $userTrackingMode
)
.edgesIgnoringSafeArea(.all)
.frame(maxWidth: .infinity,maxHeight: .infinity,alignment: .center)
ButtonLayer(mapView: mapView,userTrackingMode: $userTrackingMode,showSheet: $showSheet)
.frame(maxWidth: .infinity,maxHeight: .infinity)
.padding(.margin)
}
.edgesIgnoringSafeArea(.all)
.navigationBarHidden(true)
.sheet(isPresented: $showSheet) {
SettingsView()
}
这实际上纠正了问题。而且我可以使用 NavigationLinks 毫无问题地推送视图。
我想在这里学到的教训是:
SwiftUI 与 UIKit 的交互比我想象的要好。
我仍然不知道的是:如果 NavigationView 只是将您的视图包装在 UINavigationController 中,为什么会出现这个问题?我尝试在一个干净的项目中重现它,但没有运气。所以我怀疑在我们的应用中做了一些事情来自定义导航栏或标签栏会导致这个问题。
经过多次挖掘,我找不到根本原因。所以这个解决方法暂时就足够了。