Skip to content

Commit 653a461

Browse files
committed
The two handles cannot cross
1 parent 768060a commit 653a461

File tree

1 file changed

+22
-11
lines changed

1 file changed

+22
-11
lines changed

RangeSlider/RangeSlider.swift

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,23 @@ struct RangeSlider: View {
2323
ZStack {
2424
RangeSliderFilledTrack()
2525
.frame(width: geometry.size.width * (upperValue - lowerValue))
26-
.position(CGPoint(x: (upperValue + lowerValue) / 2 * geometry.size.width, y: 2.0))
26+
.position(CGPoint(x: (upperValue + lowerValue) / 2 * (geometry.size.width - 2 * RangeSliderHandle.size) + RangeSliderHandle.size, y: 2.0))
2727
RangeSliderHandle()
28-
.position(CGPoint(x: RangeSliderHandle.size / 2 + lowerValue * geometry.size.width, y: 2.0))
28+
.position(CGPoint(x: RangeSliderHandle.size / 2 + lowerValue * (geometry.size.width - 2 * RangeSliderHandle.size), y: 2.0))
2929
.gesture(
3030
DragGesture(minimumDistance: 0)
3131
.onChanged { value in
32+
let x = RangeSliderHandle.size
3233
updating = true
33-
let delta = value.translation.width / geometry.size.width
34-
lowerValue = min(max(lowerLast + delta, 0), upperLast)
34+
// let delta = value.translation.width / geometry.size.width
35+
// lowerValue = min(max(lowerLast + delta, 0), upperLast)
36+
lowerValue = min(max(lowerLast + value.translation.width / (geometry.size.width - 2 * x), 0), upperLast)
3537
}
3638
.onEnded { value in
37-
let delta = value.translation.width / geometry.size.width
38-
lowerValue = min(max(lowerLast + delta, 0), upperLast)
39+
// let delta = value.translation.width / geometry.size.width
40+
// lowerValue = min(max(lowerLast + delta, 0), upperLast)
41+
let x = RangeSliderHandle.size
42+
lowerValue = min(max(lowerLast + value.translation.width / (geometry.size.width - 2 * x), 0), upperLast)
3943
lowerLast = lowerValue
4044
updating = false
4145
}
@@ -47,17 +51,24 @@ struct RangeSlider: View {
4751
}
4852

4953
RangeSliderHandle()
50-
.position(CGPoint(x: -(RangeSliderHandle.size / 2) + upperValue * geometry.size.width, y: 2.0))
54+
.position(CGPoint(x: 3.0 * RangeSliderHandle.size / 2.0 + upperValue * (geometry.size.width - 2 * RangeSliderHandle.size), y: 2.0))
5155
.gesture(
5256
DragGesture(minimumDistance: 0)
5357
.onChanged { value in
5458
updating = true
55-
let delta = value.translation.width / geometry.size.width
56-
upperValue = min(max(upperLast + delta, lowerLast), 1)
59+
// let delta = value.translation.width / geometry.size.width
60+
// upperValue = min(max(upperLast + delta, lowerLast), 1)
61+
62+
let x = RangeSliderHandle.size
63+
upperValue = min(max(upperLast + value.translation.width / (geometry.size.width - 2 * x), lowerLast), 1)
5764
}
5865
.onEnded { value in
59-
let delta = value.translation.width / geometry.size.width
60-
upperValue = min(max(upperLast + delta, lowerLast), 1)
66+
// let delta = value.translation.width / geometry.size.width
67+
// upperValue = min(max(upperLast + delta, lowerLast), 1)
68+
69+
let x = RangeSliderHandle.size
70+
upperValue = min(max(upperLast + value.translation.width / (geometry.size.width - 2 * x), lowerLast), 1)
71+
6172
upperLast = upperValue
6273
updating = false
6374
}

0 commit comments

Comments
 (0)