单个 Slider 的 Swiftui 多重绑定

Posted

技术标签:

【中文标题】单个 Slider 的 Swiftui 多重绑定【英文标题】:Swiftui multiple binding for a single Slider 【发布时间】:2021-11-10 19:34:33 【问题描述】:

如何将多个变量绑定到单个 Slider 是 SwiftUI?

我想要 1 个滑块来更改 2 个变量,一个在 1 到 5 的范围内,另一个在 1000 到 1200 的范围内。或者有任何解决方法吗?

所以当变量 1 = 1 时,变量 2 应该是 1000,而当变量 1 = 5 时,变量 2 应该是 1200,介于两者之间。 谢谢(我是编程新手)

struct ContentView: View 
    @State private var variable1 = 1.0
    @State private var variable2 = 1000.0
    var body: some View 
        VStack 
            Slider(value: $variable1, in: 1...5, step: 0.25)
        
    

【问题讨论】:

【参考方案1】:

一种解决方案是使用计算属性,而不是使用第二个 @State 变量:

struct ContentView: View 
    @State private var variable1 = 1.0
    
    private var variable1Range = 1.0...5.0
    private var variable2Range = 1000.0...1200.0
    
    var variable2 : Double 
        floatingMap(minRange: variable1Range.lowerBound, maxRange: variable1Range.upperBound, minDomain: variable2Range.lowerBound, maxDomain: variable2Range.upperBound, value: variable1)
    
    
    var body: some View 
        VStack 
            Text("Variable 1: \(variable1)")
            Text("Variable 2: \(variable2)")
            Slider(value: $variable1, in: variable1Range, step: 0.25)
            
        
    


func floatingMap<T:FloatingPoint>(minRange:T, maxRange:T, minDomain:T, maxDomain:T, value:T) -> T 
    return minDomain + (maxDomain - minDomain) * (value - minRange) / (maxRange - minRange)

如果您确实需要两个@State 变量,您可以使用onChange 观察variable1 并根据其值在variable2 上分配一个新值:

struct ContentView: View 
    @State private var variable1 = 1.0
    @State private var variable2 = 1000.0
    
    private var variable1Range = 1.0...5.0
    private var variable2Range = 1000.0...1200.0
    
    
    var body: some View 
        VStack 
            Text("Variable 1: \(variable1)")
            Text("Variable 2: \(variable2)")
            Slider(value: $variable1, in: variable1Range, step: 0.25)
        .onChange(of: variable1)  variable1 in
            variable2 = floatingMap(minRange: variable1Range.lowerBound, maxRange: variable1Range.upperBound, minDomain: variable2Range.lowerBound, maxDomain: variable2Range.upperBound, value: variable1)
        
    


func floatingMap<T:FloatingPoint>(minRange:T, maxRange:T, minDomain:T, maxDomain:T, value:T) -> T 
    return minDomain + (maxDomain - minDomain) * (value - minRange) / (maxRange - minRange)

【讨论】:

谢谢,这很好。

以上是关于单个 Slider 的 Swiftui 多重绑定的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI脑洞大开打造实时显示当前值的Slider

SwiftUI脑洞大开打造实时显示当前值的Slider(滑动器)

如何在 SwiftUI 中自定义 Slider 蓝线?

13:SwiftUI-slider滑块

SwiftUI Slider 使用 VoiceOver 不解释双击

SwiftUI:Slider 在导航栏项目的前导/尾随时的奇怪行为