How to enable “tap and slide” in a UISlider?

后端 未结 14 545
不知归路
不知归路 2020-12-03 20:54

What I want to get is a UISlider which lets the user not only slide when he starts on its thumbRect, but also when he taps elsewhere. When the user

14条回答
  •  时光取名叫无心
    2020-12-03 21:35

    I converted the answer provided by DWilliames to Swift

    Inside your viewDidAppear()

    let longPress                  = UILongPressGestureRecognizer(target: self.slider, action: Selector("tapAndSlide:"))
    longPress.minimumPressDuration = 0
    self.addGestureRecognizer(longPress)
    

    Class file

    class TapUISlider: UISlider
    {
        func tapAndSlide(gesture: UILongPressGestureRecognizer)
        {
            let pt           = gesture.locationInView(self)
            let thumbWidth   = self.thumbRect().size.width
            var value: Float = 0
    
            if (pt.x <= self.thumbRect().size.width / 2)
            {
                value = self.minimumValue
            }
            else if (pt.x >= self.bounds.size.width - thumbWidth / 2)
            {
                value = self.maximumValue
            }
            else
            {
                let percentage = Float((pt.x - thumbWidth / 2) / (self.bounds.size.width - thumbWidth))
                let delta      = percentage * (self.maximumValue - self.minimumValue)
    
                value          = self.minimumValue + delta
            }
    
            if (gesture.state == UIGestureRecognizerState.Began)
            {
                UIView.animateWithDuration(0.35, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut,
                animations:
                {
                    self.setValue(value, animated: true)
                    super.sendActionsForControlEvents(UIControlEvents.ValueChanged)
                },
                completion: nil)
            }
            else
            {
                self.setValue(value, animated: false)
            }
        }
    
        func thumbRect() -> CGRect
        {
            return self.thumbRectForBounds(self.bounds, trackRect: self.bounds, value: self.value)
        }
    }
    

提交回复
热议问题