Изменить значение UISlider с помощью жеста смахивания
У меня есть UIView с жестом смахивания.
let swipeUpGesture = UISwipeGestureRecognizer(target: self, action: #selector(NextStepCaptureVC.handleSwipeUp(gesture:)))
swipeUpGesture.direction = .up
view.addGestureRecognizer(swipeUpGesture)
func handleSwipeUp(gesture: UISwipeGestureRecognizer) {
print("Swipe Up")
heightSlider.setValue(20, animated: true)
}
Когда я пытаюсь изменить значение, оно работает, но значение изменяется от 0 до 20. Я хочу, чтобы значение непрерывно изменялось при смахивании. Как мне это сделать?
3 ответа
Судя по вашему коду, похоже, что вы пытаетесь заставить "панорамирование вверх и вниз" на экране переводиться на UISlider
значение меняется.
Как уже упоминалось другими, первое, что нужно изменить UISwipeGestureRecognizer
к UIPanGestureRecognizer
let pan = UIPanGestureRecognizer(target: self, action: #selector(pan(gesture:)))
view.addGestureRecognizer(pan)
Затем в вашей функции панорамирования вам нужно обновить значение ползунка в зависимости от того, насколько сильно пользователь панорамировал.
func pan(gesture: UIPanGestureRecognizer) {
// The amount of movement up/down since last change in slider
let yTranslation = gesture.translation(in: gesture.view).y
// The slide distance needed to equal one value in the slider
let tolerance: CGFloat = 5
if abs(yTranslation) >= tolerance {
let newValue = heightSlider.value + Float(yTranslation / tolerance)
heightSlider.setValue(newValue, animated: true)
// Reset the overall translation within the view
gesture.setTranslation(.zero, in: gesture.view)
}
}
Просто настройте tolerance
переменная, чтобы пользователь проводил больше / меньше, чтобы настроить значение ползунка.
Вы не хотите UISwipeGestureRecognizer
ты хочешь UIPanGestureRecognizer
, Размах - это одноразовый жест.
Документация Apple гласит: "Проведение - это отдельный жест, и, следовательно, соответствующее сообщение о действии отправляется только один раз за жест".
Вы настраиваете основное действие от вашего распознавателя жестов до вашего кода (вы можете использовать конструктор интерфейса для этого)
@IBAction func handlePan(recognizer:UIPanGestureRecognizer) {
if recognizer.state == UIGestureRecognizerState.Began {
} else if recognizer.state == UIGestureRecognizerState.Ended {
} else if recognizer.state == UIGestureRecognizerState.Changed {
}
}
Удачи! знак равно