Library / Pickers, sliders & steppers
Slider with snapping detents
A slider that snaps to marked stops (0 / 25 / 50 / 75 / 100) and clicks at each detent.
import SwiftUI
struct DetentSlider: View {
@State private var value: Double = 50
@State private var lastDetent: Double? = nil
let detents: [Double] = [0, 25, 50, 75, 100]
private let click = UIImpactFeedbackGenerator(style: .rigid)
var body: some View {
Slider(value: $value, in: 0...100)
.onChange(of: value) { _, newValue in
// Which detent are we within snapping range of?
let near = detents.first { abs($0 - newValue) < 2.5 }
if let near, near != lastDetent {
lastDetent = near
value = near // snap
click.impactOccurred(intensity: 0.55)
} else if near == nil {
lastDetent = nil // left the detent
}
}
}
}