Search code examples
iosswiftuigesturerecognizeruislideruitapgesturerecognizer

Tap on UISlider to Set the Value


I created a Slider (operating as control of the video, like YouTube has at the bottom) and set the maximum (duration) and minimum values. And then used SeekToTime to change the currentTime. Now, the user can slide the thumb of the slider to change the value

What I want to achieve is letting the user tap on anywhere on the slider and set the current time of the video.

I got an approach from this answer, and I tried to apply it to my case, but couldn't make it work

class ViewController: UIViewController, PlayerDelegate {

var slider: UISlider!

override func viewDidLoad() {
  super.viewDidLoad()

  // Setup the slider
}

func sliderTapped(gestureRecognizer: UIGestureRecognizer) {
  //  print("A")

  let pointTapped: CGPoint = gestureRecognizer.locationInView(self.view)

  let positionOfSlider: CGPoint = slider.frame.origin
  let widthOfSlider: CGFloat = slider.frame.size.width
  let newValue = ((pointTapped.x - positionOfSlider.x) * CGFloat(slider.maximumValue) / widthOfSlider)

  slider.setValue(Float(newValue), animated: true)      
 }
}

I thought this should work, but no luck. Then I tried debugging with trying to printing "A" to logs, but it doesn't so apparently it doesn't go into the sliderTapped() function.

What am I doing wrong? Or is there a better way to achieve what I am trying to achieve?


Solution

  • Looks like you need to actually initialize the tap gesture recognizer in your viewDidLoad() per the code example above. There's a comment there, but I don't see the recognizer being created anywhere.

    Swift 2:

    class ViewController: UIViewController {
    
        var slider: UISlider!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Setup the slider
    
            // Add a gesture recognizer to the slider
            let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "sliderTapped:")
            self.slider.addGestureRecognizer(tapGestureRecognizer)
        }
    
        func sliderTapped(gestureRecognizer: UIGestureRecognizer) {
            //  print("A")
    
            let pointTapped: CGPoint = gestureRecognizer.locationInView(self.view)
    
            let positionOfSlider: CGPoint = slider.frame.origin
            let widthOfSlider: CGFloat = slider.frame.size.width
            let newValue = ((pointTapped.x - positionOfSlider.x) * CGFloat(slider.maximumValue) / widthOfSlider)
    
            slider.setValue(Float(newValue), animated: true)      
        }
    }
    

    Swift 3:

    class ViewController: UIViewController {
    
        var slider: UISlider!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Setup the slider
    
            // Add a gesture recognizer to the slider
            let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(sliderTapped(gestureRecognizer:)))
            self.slider.addGestureRecognizer(tapGestureRecognizer)
        }
    
        func sliderTapped(gestureRecognizer: UIGestureRecognizer) {
            //  print("A")
    
            let pointTapped: CGPoint = gestureRecognizer.location(in: self.view)
    
            let positionOfSlider: CGPoint = slider.frame.origin
            let widthOfSlider: CGFloat = slider.frame.size.width
            let newValue = ((pointTapped.x - positionOfSlider.x) * CGFloat(slider.maximumValue) / widthOfSlider)
    
            slider.setValue(Float(newValue), animated: true)
        }
    }