2015-12-16 1 views
-2

J'ai un UISlider et je veux définir sa valeur de 1 à 10. Le code que j'utilise est. Ce que je veux faire est d'animer le UISlider de sorte qu'il faut 0,5 secondes pour changer. Je ne veux pas que ça soit aussi nerveux.UISlider set valeur

Mon idée jusqu'ici est.

let slider = UISlider() 
slider.value = 1.0 
// This works I know that 
UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveEaseInOut, animation: { slider.value = 10.0 } completion: nil) 

Je cherche la solution dans Swift.

+1

Avez-vous regardé les documents pour 'UISlider'? Il existe une méthode pour définir une valeur avec animation. – rmaddy

+0

Cette question est essentiellement une copie de http://stackoverflow.com/questions/20539913/uiview-animatewithduration-not-working-with-uislider sauf que la réponse (aussi simple soit-elle) est en Objective-C. – rmaddy

+0

@rmaddy Merci pour tout ce que je ressens comme vous avez répondu à plusieurs questions pour moi. Votre très généreux avec votre temps et aider les gens ici et je l'apprécie. –

Répondre

4

ÉDITÉ

Après discussion, je pensais que je clarifier les différences entre les deux solutions proposées:

  1. En utilisant la méthode UISlider intégrée .setValue(10.0, animated: true).
  2. Encapsulation de cette méthode dans un UIView.animateWithDuration.

Puisque l'auteur demande explicitement une modification qui prendra 0.5s --- éventuellement déclenchée par une autre action --- la deuxième solution est de préférer. A titre d'exemple, considérons qu'un bouton est connecté à une action qui définit le curseur sur sa valeur maximale.

@IBOutlet weak var slider: UISlider! 

@IBAction func buttonAction(sender: AnyObject) { 
    // Method 1: no animation in this context 
    slider.setValue(10.0, animated: true) 

    // Method 2: animates the transition, ok! 
    UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveEaseInOut, animations: { 
     self.slider.setValue(10.0, animated: true) }, 
     completion: nil) 
} 

Exécution d'une application simple unique UIVIewController avec seulement les objets UISlider et UIButton présentent des rendements les résultats suivants.

  • Method 1: diapositive instantanée (même si animated: true)
  • Method 2: anime transition. Notez que si nous définissons animated: false dans ce contexte, la transition sera instantanée.
+1

Pourquoi ne pas simplement utiliser la méthode fournie par 'UISlider' pour animer le changement de valeur? – rmaddy

+1

Voir @rmaddy comment –

+0

Merci les gars je l'ai trouvé et la réponse a été éditée. –

1

le problème avec @ la réponse initiative Indo-Pacifique est que le bleu Tracker minimum passe de 100% à la valeur, donc afin de résoudre, vous devez changer la méthode un peu:

extension UISlider 
{ 
    ///EZSE: Slider moving to value with animation duration 
    public func setValue(value: Float, duration: Double) { 
    UIView.animateWithDuration(duration, animations: {() -> Void in 
     self.setValue(self.value, animated: true) 

     }) { (bol) -> Void in 
     UIView.animateWithDuration(duration, animations: {() -> Void in 
      self.setValue(value, animated: true) 
      }, completion: nil) 
    } 
    } 
}