我有一个 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 边框联系起来吗?
在您看到的橙色图像上,设备背景。最重要的是,我的 MetalView 正在渲染键盘图像。最重要的是,我的 SwiftUI 视图正在渲染:
var body: some View {
Color.black.opacity(0.5)
}
由于我对 SwitUI 视图的约束与 MetalView 相关联,我希望 black.opacity(0.5) 覆盖整个 MetalView,但正如您所见,它在底部留下了一小部分未被覆盖。这是为什么 ?