0

我有一个 UIViewController 中包含 MetalView 的 iOS 应用程序,所有设置都在故事板中。

现在我想在金属视图上混合另一个 SwiftUI 视图,它是透明的。所以只有 SwiftUI 视图的 GUI 元素对用户可见,背景是我的 MetalView。

我使用以下代码执行此操作:

  let controller = UIHostingController(rootView: MainView())
  controller.modalPresentationStyle = .fullScreen
  controller.view.backgroundColor = .clear

  self.addChild(controller)
  controller.view.translatesAutoresizingMaskIntoConstraints = false
  self.view.addSubview(controller.view)
  controller.didMove(toParent: self)
  
  NSLayoutConstraint.activate([
    controller.view.topAnchor.constraint(equalTo: self.view.topAnchor),
    controller.view.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
    controller.view.leftAnchor.constraint(equalTo: self.view.leftAnchor),
    controller.view.rightAnchor.constraint(equalTo: self.view.rightAnchor)
  ])

基本上上面的代码确实有效。但是,SwiftUI 视图与 MetalView 的确切边界无关,尽管我的约束要求这样做。问题似乎是 UIHostingController 遵守安全区域插图,尤其是在底部和顶部,SwiftUI 视图始终是圆形的并且有点小。

我已经尝试了安全区域插入设置并尝试了几种演示样式,但没有任何帮助。

有人知道我如何将 SwiftUI 边框与 UIView 边框联系起来吗?

2021 年 10 月 18 日更新: 在此处输入图像描述

在您看到的橙色图像上,设备背景。最重要的是,我的 MetalView 正在渲染键盘图像。最重要的是,我的 SwiftUI 视图正在渲染:

var body: some View {
  Color.black.opacity(0.5)
}

由于我对 SwitUI 视图的约束与 MetalView 相关联,我希望 black.opacity(0.5) 覆盖整个 MetalView,但正如您所见,它在底部留下了一小部分未被覆盖。这是为什么 ?

4

1 回答 1

0

我找到了。问题不在于 HostingController。事实上,它已经超出了安全区域。

问题出在我的 SwiftUIView 上。您必须添加:

.ignoresSafeArea()

将视图扩展到安全区域范围之外。感谢brandonscript为我指明了方向。

于 2021-10-20T06:10:48.203 回答