当另一个视图处于活动状态时如何模糊背景?

时间:2020-08-12 10:31:12

标签: swiftui

当第二个视图处于活动状态时,我尝试模糊第一个VStack。 但是这样做时,每次点击“启用模糊”按钮的背景颜色都会改变。 我不确定我在哪里出问题了,想知道是否有更好的方法可以做到这一点。

struct ContentView: View {
    
    @State private var showWindow = false
    var body: some View {
        ZStack{
            VStack{
                Button(action: {self.showWindow.toggle()}){
                    Text("Enable Blur")
                        .foregroundColor(.white)
                        .padding()
                        .background(Color.black)
                        .cornerRadius(5)
                }
            }.blur(radius: showWindow ? 5 : 0)
            VStack{
                if(showWindow){
                    DatePickerView(showWindow: self.$showWindow)
                }
            }
        }
    }
}

struct DatePickerView: View {
    @Binding var showWindow: Bool
    var body: some View{
        VStack{
            Button(action: {self.showWindow.toggle()}){
                Text("Done").foregroundColor(.white)
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

积累模糊效果是因为SwiftUI渲染引擎未确定VStack内容是否已更改,因此将其缓存的渲染变体用于下一个重绘。等等。

要解决此问题,我们需要将VStack标记为刷新。这是可能的解决方案。经过Xcode 11.4 / iOS 13.4的测试

VStack{
    Button(action: {self.showWindow.toggle()}){
        Text("Enable Blur")
            .foregroundColor(.white)
            .padding()
            .background(Color.black)
            .cornerRadius(5)
    }
}.id(showWindow)                  // << here !!
.blur(radius: showWindow ? 5 : 0)