UIScrollView scrollViewDidScroll обнаруживает касание пользователя

#ios #uiscrollview

#iOS #uiscrollview

Вопрос:

Я использую UIScrollView в своем приложении и использую scrollviewDidScroll метод для перемещения некоторых других представлений, которые не находятся внутри scrollview. Такое поведение должно происходить только тогда, когда пользователь фактически перемещает scrollview пальцем, а не когда заканчивается событие касания.

В настоящее время я использую dragging свойство scrollview, чтобы получить это поведение, но у него есть проблема: когда пользователь проводит пальцем по scrollview и снова касается его, прежде чем он перестал замедляться, dragging свойство неверно, хотя пользователь перетаскивает scrollview пальцем.

Комментарии:

1. Загляните в UIGestureRecognizerState свой TableView, например yourTableView.panGestureRecognizer.state . Это покажет, в каком именно состоянии находится касание пользователя. Сделайте это в scrollViewDidScroll .

2. Выполнено. С помощью примера кода

Ответ №1:

У UIScrollView есть panGestureRecogniser свойство, которое отслеживает жесты панорамирования в режиме прокрутки. Вы можете отслеживать state жест панорамирования в scrollViewDidScroll , чтобы точно знать, в каком состоянии находится панорамирование.

Swift 4.0

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.isEqual(yourScrollView) {
        switch scrollView.panGestureRecognizer.state {
            case .began:
                // User began dragging
                print("began")
            case .changed:
                // User is currently dragging the scroll view
                print("changed")
            case .possible:
                // The scroll view scrolling but the user is no longer touching the scrollview (table is decelerating)
                print("possible")
            default:
                break
        }
    }
}
  

Objective-C

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    if ([scrollView isEqual:yourScrollView]) {

        switch (scrollView.panGestureRecognizer.state) {

            case UIGestureRecognizerStateBegan:

                // User began dragging
                break;

            case UIGestureRecognizerStateChanged:

                // User is currently dragging the scroll view
                break;

            case UIGestureRecognizerStatePossible:

                // The scroll view scrolling but the user is no longer touching the scrollview (table is decelerating)
                break;

            default:
                break;
        }
    }
}
  

Ответ №2:

IMO лучший ответ — использование UIScrollViewDelegate , есть следующие уведомления:

 // called on start of dragging (may require some time and or distance to move)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
// called on finger up if the user dragged. velocity is in points/millisecond. targetContentOffset may be changed to adjust where the scroll view comes to rest
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0);
// called on finger up if the user dragged. decelerate is true if it will continue moving afterwards
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
  

Комментарии:

1. Вам также нужно будет прослушать scrollViewDidScrollToTop .

2. @kelin как это связано с пользовательским касанием?

3. Это событие вызывается, когда пользователь дважды касается строки состояния. Это приводит к прокрутке табличного представления вверх. Подробнее читайте в UIScrollViewDelegate документации.

4. и как это связано с вопросом?

Ответ №3:

 var lastVelocityYSign = 0

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let currentVelocityY =  scrollView.panGestureRecognizer.velocity(in: scrollView.superview).y
    let currentVelocityYSign = Int(currentVelocityY).signum()
    if currentVelocityYSign != lastVelocityYSign amp;amp;
        currentVelocityYSign != 0 {
        lastVelocityYSign = currentVelocityYSign
    }
    if lastVelocityYSign < 0 {
        print("SCROLLING DOWN")
    } else if lastVelocityYSign > 0 {
        print("SCOLLING UP")
    }
}

  

Ответ от Mos6y
https://medium.com/@Mos6yCanSwift/swift-ios-determine-scroll-direction-d48a2327a004