How to change a UISlider value using a single touch? How to change a UISlider value using a single touch? objective-c objective-c

How to change a UISlider value using a single touch?


Here tapCount is int variable that declare in .h file

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

For Swift User

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}


Correction @ipatel: Math in previous answers is incomplete and causes jitter due to missing thumb width considerations.

Here is what it should look like if you choose to subclass 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;}


Swift version for accepted answer,

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