Skip to content

Commit a023022

Browse files
Fix the single variant onValueChange handling on iOS
1 parent 8ac8ea3 commit a023022

1 file changed

Lines changed: 14 additions & 7 deletions

File tree

package/ios/RNCSliderView.swift

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ struct RNCRangedSliderContent: View {
8282

8383
/// Which end of the range a thumb drags.
8484
private enum Thumb {
85+
case single
8586
case left
8687
case right
8788
}
@@ -96,7 +97,7 @@ struct RNCRangedSliderContent: View {
9697
// inside the view, so it is short of the width by one thumb.
9798
let travel = max(geometry.size.width - (model.ranged ? diameter : 0), 0)
9899

99-
let leftOffset = offset(of: model.valueLeft, in: range, travel: travel)
100+
let leftOffset = offset(of: model.ranged ? model.valueLeft : model.value, in: range, travel: travel)
100101
let rightOffset = offset(of: model.valueRight, in: range, travel: travel)
101102

102103
let trackFillWidth = model.ranged ? max(rightOffset - leftOffset, 0) : leftOffset
@@ -114,14 +115,12 @@ struct RNCRangedSliderContent: View {
114115
.frame(width: trackFillWidth, height: Self.trackHeight)
115116
.offset(x: trackFillStartPoint)
116117

117-
thumb(.left, diameter: diameter, offset: leftOffset, range: range, travel: travel)
118-
// Both thumbs pinned to the upper bound overlap exactly, and the right
119-
// one has nowhere left to go - so the left one has to take the touches
120-
// or the pair is stuck there.
121-
.zIndex(model.valueLeft >= range.upperBound ? 1 : 0)
122-
123118
if model.ranged {
124119
thumb(.right, diameter: diameter, offset: rightOffset, range: range, travel: travel)
120+
thumb(.left, diameter: diameter, offset: leftOffset, range: range, travel: travel)
121+
.zIndex(model.valueLeft >= range.upperBound ? 1 : 0)
122+
} else {
123+
thumb(.single, diameter: diameter, offset: leftOffset, range: range, travel: travel)
125124
}
126125
}
127126
.frame(width: geometry.size.width, height: geometry.size.height)
@@ -180,6 +179,7 @@ struct RNCRangedSliderContent: View {
180179

181180
private func value(of thumb: Thumb) -> Double {
182181
switch thumb {
182+
case .single: return model.value
183183
case .left: return model.valueLeft
184184
case .right: return model.valueRight
185185
}
@@ -189,6 +189,11 @@ struct RNCRangedSliderContent: View {
189189
/// other thumb, and reports it to JS. The two thumbs cannot swap places.
190190
private func set(_ newValue: Double, of thumb: Thumb, in range: ClosedRange<Double>) {
191191
switch thumb {
192+
case .single:
193+
let clamped = newValue.clamped(to: range)
194+
guard clamped != model.value else { return }
195+
model.value = clamped
196+
model.onValueChange?(clamped)
192197
case .left:
193198
let clamped = newValue.clamped(
194199
to: range.lowerBound...model.valueRight.clamped(to: range)
@@ -208,13 +213,15 @@ struct RNCRangedSliderContent: View {
208213

209214
private func dragOrigin(of thumb: Thumb) -> Double? {
210215
switch thumb {
216+
case .single: return model.leftDragOrigin
211217
case .left: return model.leftDragOrigin
212218
case .right: return model.rightDragOrigin
213219
}
214220
}
215221

216222
private func setDragOrigin(_ origin: Double?, of thumb: Thumb) {
217223
switch thumb {
224+
case .single: model.leftDragOrigin = origin
218225
case .left: model.leftDragOrigin = origin
219226
case .right: model.rightDragOrigin = origin
220227
}

0 commit comments

Comments
 (0)