3

有谁知道如何处理这个问题?好像当你有一个带有 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 一切看起来和功能都符合预期。

4

2 回答 2

4

我找到了解决此问题的方法。但是,我想使用纯 swiftUI 解决方案,而不是下面的解决方法。因此,我将保持开放状态,看看其他人是否有其他见解。

在检查视图层次调试器时,我注意到以下内容:

视图被包裹在 NotifyingMultiColumnSplitViewController 中

导航视图样式为 SplitView...,这是一种 iPad 样式。我实际上并没有设定我的风格。所以也许是一个错误导致它默认为那个。

我尝试将 NavigationView 样式更改为 StackNavigationViewStyle()。

虽然这并没有解决问题,但它确实清理了视图层次结构并将我的 UIHostingViewController 包装在适当的 UINavigationController 中。

它还将底部灰色的“安全区域”更改为白色。

这告诉我,当它在 UIHostingController 中使用时,NavigationView 只是将您的视图包装在标准 UINavigationController 中。而且由于我与 UIKit 交互,因此将标签栏的根设置为 UINavigationController 而不是其中带有 NavigationView 的 UIHostingController 可能更有意义。

因此,遇到问题的选项卡现在正在填充:

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 中,为什么会有这个问题?我尝试在一个干净的项目中复制它并且没有运气。所以我怀疑在我们的应用程序中进行了一些自定义导航栏或标签栏的操作导致了这个问题。

经过大量挖掘,我找不到根本原因。因此,这种解决方法暂时就足够了。

于 2021-01-12T22:16:07.930 回答
0

当您在 UITabBar 中嵌入 UIHostingController 时会发生这种情况。要移除这条灰线,只需设置 UITabBar 的半透明度。

tabBar.isTranslucent = true
于 2022-02-10T10:07:58.960 回答