如何使 UIView 内的 SwiftUI 视图透明或半透明?

Lor*_*lor 2 uikit ios swift swiftui

尽管 SwiftUI 视图在添加到 UIView 后设置了不透明度,0.5但它仍然具有纯色。如果仔细观察,您可以看到 SwiftUI 视图的白色背景位于下面矩形的顶角处。

下面的代码将一个 UILabel 和一个 SwiftUI 矩形视图添加到根视图中,该矩形的不透明度为 0.5,因此它应该可以看穿其后面的文本“Test”,但它看起来有一个不透明的背景。

我还尝试将 SwiftUI 视图实例的父视图的背景颜色设置为 color clear,但是,

是否可以在 UIView 中使 SwiftUI 视图透明或半透明?

import UIKit
import SwiftUI

import PlaygroundSupport

struct Foo: View {
    var body: some View {
        ZStack {
            RoundedRectangle(cornerRadius: 18)
                .fill(Color.red)
        }
        .background(Color.red)
        .opacity(0.5)
    }
}

class ViewController:UIViewController{
    override func viewDidLoad() {
        super.viewDidLoad()

        let label = UILabel()
        label.text = "TEST"
        
        view.addSubview(label)
        label.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            label.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        ])
        
        let fooView = Foo()
        let controller = UIHostingController(rootView: fooView)
        let subview = controller.view!
        
        view.addSubview(subview)
        view.backgroundColor = .clear
        subview.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            
            subview.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            subview.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            
            subview.widthAnchor.constraint(equalToConstant: 100),
            subview.heightAnchor.constraint(equalToConstant: 100)
        ])
    }
}

let viewController = ViewController()
PlaygroundPage.current.liveView = viewController
PlaygroundPage.current.needsIndefiniteExecution = true
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Lor*_*lor 8

因为“默认情况下每个托管控制器视图都是不透明的”,所以将以下内容添加到 SwiftUI 视图可以解决该问题。

let fooView = Foo()
let controller = UIHostingController(rootView: fooView)
let subview = controller.view!
        
subview.backgroundColor = .clear // <--- THIS LINE
Run Code Online (Sandbox Code Playgroud)

参考 如何在工作表视图上制作不透明的背景颜色?