swift - 使 TabView 背景透明

标签 swift swiftui opacity tabview

SwiftUI 中的 View 默认具有透明背景。这通常意味着它们具有白色背景,因为这是您应用的默认背景颜色。但是,这也意味着您可以使用 ZStack更改整个应用程序的背景颜色,除非您明确设置自己的背景颜色,否则该颜色将显示在所有 View 中:

struct Main: View {
    var body: some View {
        ZStack {
            Color.orange.edgesIgnoringSafeArea(.all)

            // Sub-view inlined
            VStack {
                Text("Hello World")
                Button("Press Me", action: { print("Pressed") })
            }
        }
    }
}
enter image description here
我遇到的问题是,这对于 TabView 来说不是真的。 :
struct Main: View {
    var body: some View {
        ZStack {
            Color.orange.edgesIgnoringSafeArea(.all)

            // Sub-view inlined
            TabView {
                VStack {
                    Text("Hello World")
                    Button("Press Me", action: { print("Pressed") })
                }.tabItem {
                    Text("First Page")
                }
            }
        } 
    }
}
TabView阻止背景颜色:
enter image description here
我可以改变 subview 的背景颜色,但如果我让它透明,背景又会变成白色,而不是在 ZStack 中显示底层颜色。 .我还尝试了各种其他方法来制作 TabView透明,比如设置背景为Color.clear ,但无济于事。
TL;博士
是否可以制作 TabView透明而不是白色?

最佳答案

每个选项卡的托管 View 都有系统背景颜色(不透明)。
demo1
这是可能的解决方法。使用 Xcode 12/iOS 14 测试
demo

struct BackgroundHelper: UIViewRepresentable {
    func makeUIView(context: Context) -> UIView {
        let view = UIView()
        DispatchQueue.main.async {
            // find first superview with color and make it transparent
            var parent = view.superview
            repeat {
                if parent?.backgroundColor != nil {
                    parent?.backgroundColor = UIColor.clear
                    break
                }
                parent = parent?.superview
            } while (parent != nil)
        }
        return view
    }

    func updateUIView(_ uiView: UIView, context: Context) {}
}

struct ContentView: View {
    var body: some View {
        ZStack {
            Color.orange.edgesIgnoringSafeArea(.all)

            // Sub-view inlined
            TabView {
                VStack {
                    Text("Hello World")
                    Button("Press Me", action: { print("Pressed") })
                }
                .background(BackgroundHelper())  // add to each tab if needed
                .tabItem {
                    Text("First Page")
                }
                Text("Second")
                    .background(BackgroundHelper())  // add to each tab if needed
                    .tabItem {
                        Text("Second Page")
                    }
            }
        }
    }
}

关于swift - 使 TabView 背景透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63178381/

相关文章:

swift - 在 SwiftUI 中是否有一种简单的方法可以通过捏合来放大图像?

ios - NavigationLink 与 SwiftUI : Type of expression is ambiguous without more context

javascript - 使用 ObjectLoader 加载的 THREE.js 对象无法更改不透明度

ios - 使用通过委托(delegate)从另一个 View Controller 传递的数据将行插入到 UITableView 中

Swift Combine Framework - 如何正确观察数组?

ios - 通过函数使用Gesture时类型 'any View'不能符合 'View'

css - DIV框透明,里面的文字不透明

swift - 达到最大时间戳计数,不会记录更多事件 Xcode

ios - 根据表格 View 单元格中的内容更改 uilabel 高度

javascript - 修改 iBox javascript 文件中的不透明度