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

如何解决嵌入在 UIHostingController 中的 NavigationView 具有额外的安全区域插图

有人知道怎么处理吗?似乎当您有一个带有 NavigationView 的 UIHostingController 时,会发生以下情况:

enter image description here

注意大的灰色标签栏安全区域。

这主要是一个 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 解决方案,而不是以下解决方法。所以我将这个问题保持开放,看看其他人是否有其他见解。

在检查视图层次结构调试器时,我注意到以下几点:

The View is wrapped in a NotifyingMultiColumnSplitViewController

导航视图样式是 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 中,为什么会出现这个问题?我尝试在一个干净的项目中重现它,但没有运气。所以我怀疑在我们的应用中做了一些事情来自定义导航栏或标签栏会导致这个问题。

经过多次挖掘,我找不到根本原因。所以这个解决方法暂时就足够了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?