Свифт 3,1
Иногда вам нужно, чтобы события перетаскивания ползунка запускались непрерывно, но есть возможность выполнения другого кода в зависимости от того, перетаскивается ли ползунок или только что закончил перетаскивание.
Чтобы сделать это, я расширил ответ Энди, который использует свойство ползунка isTracking
. Мне нужно было записать два состояния: sliderHasFinishedTracking
и sliderLastStoredValue
.
Мой код правильно:
не запускает действие при начальном перетаскивании
запускает действие, если пользователь только перемещает ползунок одним нажатием (это означает, что isTracking
остается false
)
class SliderExample: UIViewController {
var slider: UISlider = UISlider()
var sliderHasFinishedTracking: Bool = true
var sliderLastStoredValue: Float!
override func loadView() {
super.loadView()
slider.minimumValue = 100.0
slider.maximumValue = 200.0
slider.isContinuous = true
slider.value = 100.0
self.sliderLastStoredValue = slider.value
slider.addTarget(self, action: #selector(respondToSlideEvents), for: .valueChanged)
// add your slider to the view however you like
}
func respondToSlideEvents(sender: UISlider) {
let currentValue: Float = Float(sender.value)
print("Event fired. Current value for slider: \(currentValue)%.")
if(slider.isTracking) {
self.sliderHasFinishedTracking = false
print("Action while the slider is being dragged ⏳")
} else {
if(self.sliderHasFinishedTracking && currentValue == self.sliderLastStoredValue){
print("Slider has finished tracking and its value hasn't changed, " +
"yet event was fired anyway. ?") // No need to take action.
} else {
self.sliderHasFinishedTracking = true
print("Action upon slider drag/tap finishing ⌛️")
}
}
self.sliderLastStoredValue = currentValue
}
}