swift 嵌入在UIHostingController中的NavigationView具有额外的安全区域插图

gstyhher  于 2022-12-21  发布在  Swift
关注(0)|答案(4)|浏览(181)

有人知道如何处理这个问题吗?似乎当你有一个带有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,则所有内容的外观和功能都符合预期。

9lowa7mx

9lowa7mx1#

我找到了解决这个问题的方法。但是,我想使用纯swiftUI解决方案,而不是下面的解决方法。因此,我将这个问题留到其他人是否有其他见解时再讨论。
在检查视图层次结构调试器时,我注意到以下问题:

导航视图样式是SplitView...这是iPad的样式。我实际上并没有设置我的样式。所以可能是一个bug导致它默认为这个样式。
我尝试将NavigationView样式更改为StackNavigationViewStyle()。
虽然这并没有解决问题,但它确实清理了视图层次结构,并将我的UIHostingViewController Package 在一个适当的UINavigationController中。
它还将底部灰色的“安全区域”改为白色。
这告诉我,NavigationView只是在UIHostingController中使用时将视图 Package 在标准的UINavigationController中。由于我与UIKit接口,因此将选项卡栏的根设置为UINavigationController比将其内部包含NavigationView的UIHostingController更有意义。
因此,遇到此问题的选项卡现在填充了以下内容:
第一个月
我的视图代码就是

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只是将您的视图 Package 在UINavigationController中,为什么它会出现此问题?我尝试在一个干净的项目中重现此问题,但没有成功。因此我怀疑应用程序中自定义导航栏或选项卡栏的操作导致了此问题。
经过大量的挖掘,我找不到根本原因。所以这个变通办法暂时就足够了。

x6492ojm

x6492ojm2#

在UITabBar中嵌入UIHostingController时会出现这种情况。要删除此灰线,只需设置UITabBar的半透明性。

tabBar.isTranslucent = true
agyaoht7

agyaoht73#

这就是我解决类似问题的方法。
1.从SwiftUI视图中删除导航视图。
1.设置视图控制器导航栏的标题。

let vc = UIHostingController(rootView: MyView())
     vc.navigationItem.title = "Title"
     return UINavigationController(rootViewController: vc)
0vvn1miw

0vvn1miw4#

self.tabBarController?.tabBar.isTranslucent = true

对我有用。

相关问题