2017-03-03 63 views
1

我正在watchKit中创建一个自定义滑块。我有一个变量sliderPosition,其类型为CGFloat,它在UI上的位置为didSet。我使用Digital Crown更改滑块的值。给变量类型一个范围CGFloat

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 
     } 
    } 

我寻找一些本地函数以得到范围为0之间我的变种sliderPosition为1

在上述方法isValidRange有在逻辑一些错误。因为当值为1.00时,我尝试增加值,它将设置为1.01,当0.00设置为-0.01时,值将相同。

+1

看一看http://stackoverflow.com/questions/36110620/standard-way-to-clamp-a-number-between-two-values-in-swift各种限制(“钳位”)给定范围值的方法。 –

+0

@MartinR Thnx仅供参考。 –

回答

1

正如@马丁 - [R建议,也许你正在寻找 -

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

,然后用它喜欢 -

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) 
    } 
} 
+0

事实上,它的工作原理。 Thnx Basha。 –