【问题标题】:How to make SwiftUI view transparent or semi-transparent inside an UIView?如何在 UIView 中使 SwiftUI 视图透明或半透明?
【发布时间】:2021-01-19 12:59:27
【问题描述】:

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

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

我也尝试过将 SwiftUI 视图实例的父视图的背景颜色设置为颜色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

【问题讨论】:

  • 这是否回答了您的问题stackoverflow.com/a/63745596/12299030
  • 感谢@Asperi,但就我而言,Card SwiftUI 视图位于 UIKit UIView 中。
  • @Asperi 我为这个问题添加了一个可重现的 Playground sn-p。
  • 是的,这个答案提示我将背景更改为.clear

标签: ios swift swiftui uikit


【解决方案1】:

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

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

参考 How can I make a background color with opacity on a Sheet view?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 2013-12-03
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多