UIScrollView как UIControl - PullRequest
       28

UIScrollView как UIControl

0 голосов
/ 12 июня 2018

Я реализую UIControl, используя UIScrollView.Я хочу отправить событие .valueChanged, когда пользователь прокручивает представление прокрутки пальцем, а не иначе.Для этого мне нужно сравнить значение currentValue, которое я вычисляю, когда происходит прокрутка, и, если оно отличается от предыдущего значения, я отправляю событие .valueChanged через API sendActionsForControlEvents.Мои вопросы:

(a) Какой самый надежный способ во всех случаях знать, что пользователь перетаскивал представление прокрутки (прокрутка также может происходить в моем коде с использованием автоматического API) - scrollView.isDragging или scrollView.isTrackingили и то, и другое?

(б) Каким образом можно заметить изменение в currentValue (без сохранения предыдущего значения)?Я делаю это с помощью Swift 4, но, похоже, оно не дает старого значения:

 private(set) public var currentValue = Int(0) {
    willSet (newValue) {
        NSLog("Old value \(currentValue), new \(newValue)")
    }
 }

1 Ответ

0 голосов
/ 12 июня 2018

Из комментариев с использованием делегатов я считаю, что твердое решение должно выглядеть примерно так:

class MyClass: NSObject, UIScrollViewDelegate {

    private var isUserDragging: Bool = false

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if isUserDragging {
            // Should trigger only when scroll view visible frame changes and user is dragging
            print("User is dragging")
        }
    }

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        isUserDragging = true // Should only be called when user starts dragging
    }

    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        if decelerate == false {
            isUserDragging = false // Disable user dragging only if no deceleration will be performed
        }
    }

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        isUserDragging = false // When deceleration is done user is not dragging anymore
    }

}

Теперь вы сможете получить ваше мероприятие в пределах scrollViewDidScroll.

...