2

I am creating a custom slider in watchKit. I have one variable sliderPosition of type CGFloat which sets its position on UI on didSet. I change the value of slider using Digital Crown.

func didCrown(value: Double, rps: Double) {
        if isValidRange() {
            if value > 0 {
                ring.sliderPosition = ring.sliderPosition + 0.01
            } else if value < 0 {
                ring.sliderPosition = ring.sliderPosition - 0.01
            }
        }
    }

    func isValidRange() -> Bool {
        if ring.sliderPosition >= 0.00 && ring.sliderPosition <= 1.00 {
            return true
        } else if ring.sliderPosition <= 0.0 {
            ring.sliderPosition = 0
            return false
        } else {
            ring.sliderPosition = 1
            return false
        }
    }

I am looking for some native functions to give range to my var sliderPosition between 0 to 1.

In above method isValidRange there is some error in logic. Because when value is 1.00 and I try to increase the value it will set 1.01 and same for when 0.00 it sets -0.01.

Parth Adroja
  • 13,198
  • 5
  • 37
  • 71

1 Answers1

2

As @ Martin R suggests, probably you are looking for -

 extension CGFloat {
    func clamp (min: CGFloat, _ max: CGFloat) -> CGFloat {
        return Swift.max(min, Swift.min(max, self))
    }
 } 

and then use it like -

func didCrown(value: Double, rps: Double) {
       if value > 0 {
            ring.sliderPosition = (ring.sliderPosition + 0.01).clamp(min: 0.0, 1.0)
         } else if value < 0 {
             ring.sliderPosition = (ring.sliderPosition - 0.01).clamp(min: 0.0, 1.0)
     }
 }
BaSha
  • 2,356
  • 3
  • 21
  • 38