在SwiftUI中将不透明度应用到视图中,将其向下传递到层次 struct 中,看起来它的效果有点像环境值.当每个子视图独立地受不透明度影响时,它会导致这种行为.无论我们是将黄色圆圈与覆盖层、背景还是ZStack放在一起.

enter image description here

我们如何使不透明度仅影响父视图,就像它在UIKit中的行为一样,使整个视图及其所有内容成为半透明的单个实体对象?

struct OpacityTest: View {
    var body: some View {
        HStack(spacing: 30) {
            buttonContent
                .opacity(0.5)

            Button(action: {}) {
                buttonContent
            }
        }
    }
    
    var buttonContent: some View {
        Image(systemName: "calendar.circle")
            .resizable()
            .frame(width: 65, height: 65)
            .overlay(
                Circle()
                    .fill(Color.yellow)
                    .frame(width: 40, height: 40)
                    .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing)
            )
    }
}

struct OpacityTest_Preview: PreviewProvider {
    static var previews: some View {
        OpacityTest()
    }
}

Update:

.overlay(
    Circle()
        .fill(Color.yellow)
        .frame(width: 40, height: 40)
        .offset(x: 10, y: -10) //This modifier brakes the drawingGroup
        .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing)
    )

enter image description here

推荐答案

正在添加.compositingGroup()完成此工作.它使外部修改器仅在顶层工作,而不通过层次 struct .也不会裁剪具有偏移的任何子视图,并保留布局的原始框架.

var buttonContent: some View {
    Image(systemName: "calendar.circle")
        .resizable()
        .frame(width: 65, height: 65)
        .overlay(
            Circle()
                .fill(Color.yellow)
                .frame(width: 40, height: 40)
                .offset(x: 10, y: -10)
                .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing)
        )
        .compositingGroup() //here
}

Swift相关问答推荐

Swift C外部实现的Task / Future类类型

在Swift中,是否只有iOS版本超过15才能导入Swift包?

并发访问SWIFT中数组的非重叠子范围

如何在SwiftUI中做出适当的曲线?

Result类型的初始值设定项失败?

在 SwiftUI 视图中观察 UIViewRepresentable 的 @State var 变化

Observable.create 捕获行为

Swift数据关系

SwiftUI:列表背景为空列表时为黑色

swiftui中服务端图片如何设计view并赋予rotationEffect?

需要将 json 映射到 Swift 中的模型

如果 Swift 无法分配内存会怎样?

SwiftUI Grid 中的数组旋转

RxSwift:share() 替代方案,保证upstream 的单一订阅

Swift:连接两个数组而不重复共享后缀/前缀

如何在 iOS Swift 中进行多线程、并发或并行?

Swift 自定义字体 Xcode

Swift - 迭代 struct 对象时如何对其进行变异

如何使用 swift 在 tableview 中填充两个不同数组的两个部分?

如何快速显示数组的所有元素?