Как предотвратить прыжок UISlider на место во время щелчка - PullRequest
0 голосов
/ 24 октября 2018

У меня есть UISlider, который привязывается к 5 различным местам.

slider.minimumValue = 1
slider.maximumValue = 5

Привязка работает нормально, но она резкая и не плавно встает на место.Это как бы «прыгает» на место

Я пытался анимировать свиток (не сработало):

@objc func onSliderValChanged(_ sender: UISlider) {
    UIView.animate(withDuration: 0.5) {
        self.slider.value = round(sender.value)
        self.slider.setValue(round(sender.value), animated: true)
    }
}

Я также пытался добавить panGesture (не сработало):

panGesture = UIPanGestureRecognizer(target: self, action: #selector(panGestureHandler(_:)))
slider.addGestureRecognizer(panGesture)

@objc func panGestureHandler(_ recognizer: UIPanGestureRecognizer){

    let currentPoint = recognizer.location(in: slider)
    let percentage = currentPoint.x/slider.bounds.size.width

    let delta = Float(percentage) * (slider.maximumValue - slider.minimumValue)
    let value = slider.minimumValue + delta
    slider.setValue(round(value), animated: true)
}

Как сделать так, чтобы ползунок плавно прокручивался, но все еще находился на месте?

Вот оригинальный код без вышеуказанных попыток:

let slider: UISlider = {
    let slider = UISlider()
    slider.translatesAutoresizingMaskIntoConstraints = false
    slider.minimumValue = 1
    slider.maximumValue = 5
    slider.value = 3
    slider.isContinuous = true
    slider.addTarget(self, action: #selector(onSliderValChanged(_:)), for: .valueChanged)
    return slider
}()

@objc func onSliderValChanged(_ sender: UISlider) {

    slider.value = round(sender.value)
}

func setAnchors() {
    slider.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    slider.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 10).isActive = true
    slider.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -10).isActive = true
}

1 Ответ

0 голосов
/ 24 октября 2018

A UISlider рисует сам, используя несколько UIImageView подпредставлений.Когда вы изменяете ползунок value, ползунок отправляет себе setNeedsLayout, но фактически он не меняет фреймы своих подпредставлений, пока не получит layoutSubviews во время фазы макета цикла выполнения.

Чтобы анимировать изменение в значении, вам нужно сделать так, чтобы слайдер размещал свои подпредставления внутри вашего блока анимации.Таким образом:

@IBAction func sliderValueChanged(_ slider: UISlider) {
    slider.value = round(slider.value)
    UIView.animate(withDuration: 0.2, animations: {
        slider.layoutIfNeeded()
    })
}
...