Tap on UISlider to Set the Value

前端 未结 6 533
無奈伤痛
無奈伤痛 2021-02-01 19:20

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 t

6条回答
  •  旧巷少年郎
    2021-02-01 19:56

    This is my code, based on "myuiviews" answer.
    I fixed 2 little "bugs" of the original code.

    1 - Tapping on 0 was too difficult, so I made it easier
    2 - Sliding the slider's thumb just a little bit was also firing the "tapGestureRecognizer", which makes it return to the initial position, so I added a minimum distance filter to avoid that.

    Swift 4

    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)
        }
    
        @objc func sliderTapped(gestureRecognizer: UIGestureRecognizer) {
            //  print("A")
    
            var pointTapped: CGPoint = gestureRecognizer.location(in: self.view)
            pointTapped.x -= 30  //Subtract left constraint (distance of the slider's origin from "self.view" 
    
            let positionOfSlider: CGPoint = slider.frame.origin
            let widthOfSlider: CGFloat = slider.frame.size.width
    
            //If tap is too near from the slider thumb, cancel
            let thumbPosition = CGFloat((slider.value / slider.maximumValue)) * widthOfSlider
            let dif = abs(pointTapped.x - thumbPosition)
            let minDistance: CGFloat = 51.0  //You can calibrate this value, but I think this is the maximum distance that tap is recognized
            if dif < minDistance { 
                print("tap too near")
                return
            }
    
            var newValue: CGFloat
            if pointTapped.x < 10 {
                newValue = 0  //Easier to set slider to 0
            } else {
                newValue = ((pointTapped.x - positionOfSlider.x) * CGFloat(slider.maximumValue) / widthOfSlider)
            }
    
    
    
            slider.setValue(Float(newValue), animated: true)
        }
    }
    

提交回复
热议问题