2013-01-16 6 views
9

Je développe ma première application iOS qui contient une UISlider. Je sais comment obtenir la valeur lorsque le UISlider est déplacé. Mais pour mon application, je dois obtenir la valeur du curseur en une seule touche; c'est-à-dire que si je touche quelque part dans le UISlider, un UILabel devrait afficher sa valeur correcte.Comment changer une valeur UISlider en utilisant une seule touche?

Est-il possible de cette façon. Tout tutoriel ou code sera très utile.

Répondre

19

S'il vous plaît Ecrire le code ci-après peut être utile pour vous :)

Ici tapCount est int variable qui déclare dans .h

- (void)viewDidLoad 
{ 
    tapCount = 0; // Count tap on Slider 

UITapGestureRecognizer *gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sliderTapped:)]; 
    [slider addGestureRecognizer:gr]; 

} 

- (void)sliderTapped:(UIGestureRecognizer *)g 
    { 
/////////////// For TapCount//////////// 

     tapCount = tapCount + 1; 
     NSLog(@"Tap Count -- %d",tapCount); 

/////////////// For TapCount//////////// 

     UISlider* s = (UISlider*)g.view; 
     if (s.highlighted) 
      return; // tap on thumb, let slider deal with it 
     CGPoint pt = [g locationInView: s]; 
     CGFloat percentage = pt.x/s.bounds.size.width; 
     CGFloat delta = percentage * (s.maximumValue - s.minimumValue); 
     CGFloat value = s.minimumValue + delta; 
     [s setValue:value animated:YES]; 

     NSString *str=[NSString stringWithFormat:@"%.f",[self.slider value]]; 
     self.lbl.text=str; 
    } 

Pour Utilisateur rapide

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    tapCount = 0 
    let gr = UITapGestureRecognizer(target: self, action: #selector(self.sliderTapped(_:))) 
    slider.addGestureRecognizer(gr) 

} 

func sliderTapped(_ g: UIGestureRecognizer) { 

    /////////////// For TapCount//////////// 
    tapCount = tapCount + 1 
    print("Tap Count -- \(tapCount)") 
    /////////////// For TapCount//////////// 

    let s: UISlider? = (g.view as? UISlider) 
    if (s?.isHighlighted)! { 
     return 
    } 

    // tap on thumb, let slider deal with it 
    let pt: CGPoint = g.location(in: s) 
    let percentage = pt.x/(s?.bounds.size.width)! 
    let delta = Float(percentage) * Float((s?.maximumValue)! - (s?.minimumValue)!) 
    let value = (s?.minimumValue)! + delta 
    s?.setValue(Float(value), animated: true) 
    let str = String(format: "%.f", slider.value) 
    lbl.text = str 
} 
+0

est-il possible de compter le nombre de robinets sur le UISlider .. – Midas

+0

montrer ma réponse modifiée – iPatel

+0

s'il vous plaît poster aussi rapide –

0

Vous pouvez afficher la valeur actuelle de UISlider avec sa méthode d'action comme ci-dessous.

- (IBAction) sliderValueChanged:(UISlider *)sender { 
    yourLable.text = [NSString stringWithFormat:@"%.1f", [sender value]]; 
} 

Voir ces tutoriels et des exemples de UISlider:

  1. UISlider-tutorial-example-how-to-use-slider-in-iphone-sdk-xcode.
  2. iphone-slider-control-uislider-control-tutorial.

Ce second tutoriel avec l'exemple qui affiche la valeur actuelle (dernière) de UISlider en UILable voir l'image ci-dessous par exemple.

enter image description here

+0

Merci pour votre aide Paras. Mais je ne cherchais pas ça. Je suis la réponse à la recherche d'une autre question ici. C'est ce que je cherche http://stackoverflow.com/questions/2895122/iphoneprogramming-uislider-to-position-at-clicked-location – Midas

+0

alors qu'est-ce que vous voulez exactement ?? –

+0

@Ravisankarvm oh ok ok maintenant je comprends que l'utilisation cliquez ou appuyez sur l'écran juste donner cette valeur avec une valeur de curseur changé ... –

6

Correction @ipatel: Math dans les réponses précédentes est incomplète et provoque l'instabilité en raison de considérations manquantes largeur du pouce.

Voici ce qu'il devrait ressembler si vous choisissez de sous-classe UISlider:

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    [super beginTrackingWithTouch:touch withEvent:event]; 
    CGPoint touchLocation = [touch locationInView:self]; 
    CGFloat value = self.minimumValue + (self.maximumValue - self.minimumValue) * 
     ((touchLocation.x - self.currentThumbImage.size.width/2)/
     (self.frame.size.width-self.currentThumbImage.size.width)); 
    [self setValue:value animated:YES]; 

    return YES; 
} 
+0

À long terme, j'ai trouvé que l'écrasement 'UISlider' était cassant, et nécessitait une maintenance constante pour suivre les mises à jour iOS. La meilleure solution est publiée sur https://github.com/arquebuse/TGPControls. Il ne remplace pas 'UISlider', et s'est donc révélé beaucoup plus robuste. Il utilise également 'CALayer' pour les animations, qui sont lisses et entièrement personnalisables. – SwiftArchitect

1

Version Swift pour réponse acceptée,

@IBAction func sliderTappedAction(sender: UITapGestureRecognizer) 
{ 
    if let slider = sender.view as? UISlider { 

     if slider.highlighted { return } 

     let point = sender.locationInView(slider) 
     let percentage = Float(point.x/CGRectGetWidth(slider.bounds)) 
     let delta = percentage * (slider.maximumValue - slider.minimumValue) 
     let value = slider.minimumValue + delta 
     slider.setValue(value, animated: true) 
    } 
} 
Questions connexes