iPhone : How to detect the end of slider drag? iPhone : How to detect the end of slider drag? ios ios

iPhone : How to detect the end of slider drag?


If you don't need any data inbetween drag, than you should simply set:

[mySlider setContinuous: NO];

This way you will receive valueChanged event only when the user stops moving the slider.

Swift 5 version:

mySlider.isContinuous = false


You can add an action that takes two parameters, sender and an event, for UIControlEventValueChanged:

[slider addTarget:self action:@selector(onSliderValChanged:forEvent:) forControlEvents:UIControlEventValueChanged]

Then check the phase of the touch object in your handler:

- (void)onSliderValChanged:(UISlider*)slider forEvent:(UIEvent*)event {         UITouch *touchEvent = [[event allTouches] anyObject];    switch (touchEvent.phase) {             case UITouchPhaseBegan:            // handle drag began            break;        case UITouchPhaseMoved:            // handle drag moved            break;        case UITouchPhaseEnded:            // handle drag ended            break;        default:            break;    }}

Swift 4 & 5

slider.addTarget(self, action: #selector(onSliderValChanged(slider:event:)), for: .valueChanged)
@objc func onSliderValChanged(slider: UISlider, event: UIEvent) {    if let touchEvent = event.allTouches?.first {        switch touchEvent.phase {        case .began:            // handle drag began        case .moved:            // handle drag moved        case .ended:            // handle drag ended        default:            break        }    }}

Note in Interface Builder when adding an action you also have the option to add both sender and event parameters to the action.


I use the "Touch Up Inside" and "Touch up outside" notifications.

Interface Builder:

Connect both notifications in the Interface Builder to your receiving method. The method could look like this:

- (IBAction)lengthSliderDidEndSliding:(id)sender {    NSLog(@"Slider did end sliding... Do your stuff here");}

In code:

If you want to wire it programatically you would have something like this in your viewWillAppear (or wherever it fits you) call:

[_mySlider addTarget:self              action:@selector(sliderDidEndSliding:)     forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside)];

The receiving method would look like this:

- (void)sliderDidEndSliding:(NSNotification *)notification {     NSLog(@"Slider did end sliding... Do your stuff here");}