Изменить значение 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 {
    }
}

Удачи! знак равно

Другие вопросы по тегам