2013-01-16 15 views
9

Pracuję nad moją pierwszą aplikacją na iOS, która zawiera UISlider. Wiem, jak uzyskać wartość, gdy przeciągnięty jest UISlider. Ale dla mojej aplikacji potrzebuję uzyskać wartość suwaka za jednym dotknięciem; tj. jeśli dotknę gdzieś w numerze UISlider, powinien on wyświetlić poprawną wartość.Jak zmienić wartość UISlider za pomocą jednego dotknięcia?

Czy to możliwe w ten sposób. Każdy tutorial lub kod będzie bardzo pomocny.

Odpowiedz

19

Proszę napisać następujący kod może być pomocne dla Ciebie :)

Tutaj tapCount jest int zmienną zadeklarować w pliku .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; 
    } 

Dla Swift Użytkownik

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

czy istnieje sposób policzenia liczby kranów na UISlider .. – Midas

+0

pokaż moją zredagowaną odpowiedź – iPatel

+0

proszę również przesłać do SWIFT –

0

Możesz wyświetlić aktualną wartość UISlider za pomocą metody akcji, jak poniżej.

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

Zobacz te tutoriale i przykłady UISlider:

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

Ten drugi samouczek z przykładem, który wyświetla bieżącą (najnowszą) wartość UISlider w UILable, patrz na przykład poniżej.

enter image description here

+0

Niż za pomoc Paras. Ale nie szukałem tego. Odpowiedź na to pytanie szukam z innego pytania tutaj. To właśnie szukam http://stackoverflow.com/questions/2895122/iphoneprogramming-uislider- to-position-at-clicked-location – Midas

+0

to, co chcesz dokładnie? –

+0

@Ravisankarvm o ok ok teraz rozumiem, że kliknięcie lub dotknięcie ekranu wystarczy podać tę wartość ze zmienioną wartością suwaka ... –

6

Korekta @ipatel: Math w poprzednich odpowiedziach jest niekompletna i powoduje jitter z powodu brakujących rozważań szerokości kciuka.

Oto co powinno wyglądać, jeśli zdecydujesz się na podklasy 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

W dłuższej perspektywie okazało się, że nadpisywanie 'UISlider' było kruche i wymagało stałej konserwacji, aby nadążyć za aktualizacjami iOS. Lepsze rozwiązanie jest opublikowane na https://github.com/arquebuse/TGPControls. Nie zastępuje 'UISlider', a zatem okazał się znacznie bardziej solidny. Wykorzystuje również "CALayer" do animacji, które są płynne iw pełni konfigurowalne. – SwiftArchitect

1

Swift wersja dla zaakceptowanej odpowiedzi

@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) 
    } 
} 
Powiązane problemy