首页 > 解决方案 > 有没有办法为滑块定义离散步骤?

问题描述

目前我正在这样做。

Slider(value: $object, in: 500...3000, step: 500)

我想做一些类似的事情

step: 100, 500, 600, 1000, 10000

标签: swiftswiftui

解决方案


这是一种可能的方法 - 将系统包装Slider到具有重新映射逻辑的自定义滑块中。

演示(简单变体)使用 Xcode 13 / iOS 15 准备和测试

演示

struct TestIrregularSliderView: View {
    @State private var current = 500
    var body: some View {
        VStack {
            IrregularSlider(value: $current, in: [100, 500, 600, 1000, 10000])
            Text("Value: \(current)")
        }
    }
}

struct IrregularSlider<T: Comparable>: View {
    @Binding var value: T
    let values: [T]
    private let upperBound: Float
    @State private var index: Int

    init(value: Binding<T>, in values: [T]) {
        self._value = value
        self._index = State(initialValue: values.firstIndex(of: value.wrappedValue) ?? 0)

        self.values = values
        self.upperBound = Float(values.count - 1)
    }

    var body: some View {
        Slider(value: Binding(
            get: { Float(index) },
            set: { index = Int($0); value = values[Int($0)] }
        ), in: 0...upperBound, step: 1)
    }
}

推荐阅读