Detecting touches on a UISlider?
You can detect when a touch ends using two control events; try
[slider addTarget:self action:@selector(touchEnded:) forControlEvents:UIControlEventTouchUpInside];
or
[slider addTarget:self action:@selector(touchEnded:) forControlEvents:UIControlEventTouchUpOutside];
If you want to detect both types of the touchesEnd
event, use
[slider addTarget:self action:@selector(touchEnded:) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
Instead of using touchesEnded:
(which shouldn't be used for this purpose anyway), attach an action to the UISlider
's UIControlEventValueChanged
event and set the continuous
property of the UISlider
to NO
, so the event will fire when the user finishes selecting a value.
mySlider.continuous = NO;[mySlider addTarget:self action:@selector(myMethodThatFadesObjects) forControlEvents:UIControlEventValueChanged];
I couldn't get anything to capture both the start and end of the touches, but upon RTFD-ing, I came up with something that will do both.
@IBAction func sliderAction(_ sender: UISlider, forEvent event: UIEvent) { if let touchEvent = event.allTouches?.first { switch touchEvent.phase { case .began: print("touches began") sliderTouchBegan() case .ended: print("touches ended") sliderTouchEnded() default: delegate?.sliderValueUpdated(sender.value) } } }
sliderTouchBegan()
and sliderTouchEnded()
are just methods I wrote that handle animations when the touch begins and when it ends. If it's not a begin or end, it's a default
and the slider value updates.