SwiftUI:滑块在导航栏项目的前/后时的怪异行为

时间:2020-10-05 19:02:03

标签: ios swift swiftui swiftui-navigationview

我无法将Slider作为视图放置在导航栏的尾部。由于它已挂接到某个状态,因此更改它的状态非常容易,而且一点也不平滑。

这是我的示例代码:

struct ContentView: View {
    @State var opacityValue: Double = 1
    
    var body: some View {
        NavigationView {
            GeometryReader { geometry in
                VStack {
                    Slider(value: self.$opacityValue, in: 0...100, step: 5) { changed in
                        
                    }
                    Image(systemName: "photo.fill")
                        .foregroundColor(.blue)
                        .padding()
                        .opacity(opacityValue / 100)

                }.navigationBarItems(trailing: HStack(spacing: 20) {
                    Slider(value: self.$opacityValue, in: 0...100, step: 5) { _ in
                        
                    }.frame(width: 100)
                }).frame(width: geometry.size.width / 2)
            }
        }
    }
}

我在常规VStack中使用的滑块可以非常平滑地更改不透明度(甚至可以移动导航栏中的滑块。)但是,另一方面,移动导航栏中的滑块是非常不便的/跳跃。

有没有办法使这项工作成功?

1 个答案:

答案 0 :(得分:2)

您可以使用@Binding属性为Image创建新的View模型,并通过它传递不透明度,当@State属性更改且View具有要刷新

struct ContentView: View {
    @State var opacityValue: Double = 1
    var body: some View {
        NavigationView {
            GeometryReader { geometry in
                VStack {
                    
                    Slider(value: self.$opacityValue, in: 0...100, step: 5) { _ in
            
                    }
                    
                    ImageOpacityView(opacity: $opacityValue)

                }.navigationBarItems(trailing: HStack(spacing: 20) {
                    
                    Slider(value: self.$opacityValue, in: 0...100, step: 5) { _ in
                        
                    }.frame(width: 100)
                    
                }).frame(width: geometry.size.width / 2)
            }
        }
    }
    
    struct ImageOpacityView: View {
        @Binding var opacity: Double
        
        var body: some View {
            Image(systemName: "photo.fill")
                .foregroundColor(.blue)
                .padding()
                .opacity(opacity / 100)
        }
    }
}