2017-03-03 2 views
1

Ich erstelle einen benutzerdefinierten Schieberegler in WatchKit. Ich habe eine Variable sliderPosition vom Typ CGFloat, die ihre Position auf UI auf didSet setzt. Ich ändere den Wert des Sliders mit Digital Crown.Einen Bereich einem variablen Typ geben 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 
     } 
    } 

ich für einige native Funktionen suchen Bereich meiner var sliderPosition zwischen 0 bis 1.

In obigen Verfahren geben isValidRange gibt es einige Fehler in der Logik. Denn wenn der Wert 1,00 ist und ich versuche, den Wert zu erhöhen, wird er auf 1,01 gesetzt, und gleich, wenn 0,00 den Wert -0,01 festlegt.

+1

Werfen Sie einen Blick auf http://stackoverflow.com/questions/36110620/standard-to-clamp-a-number-two-values-in-swift für verschiedene Methoden, um einen Wert auf einen bestimmten Bereich zu beschränken ("clamp"). –

+0

@MartinR Thnx als Referenz. –

Antwort

1

Als @ Martin R vermuten lässt, haben Sie wahrscheinlich suchen -

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

und es dann gerne verwenden -

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

Tatsächlich funktioniert es. Thnx Basha. –

Verwandte Themen