Обнаружение, когда пользователь провел пальцем влево или вправо, чтобы перейти назад или вперед в WKWebView

Я использую WKWebView и разрешаю жесты навигации вперед и назад:

myWkWebView.allowsBackForwardNavigationGestures = true

Теперь у пользователя есть два способа вернуться назад: либо нажав кнопку, либо смахнув влево. Поведение будет другим, поэтому мне интересно, как я могу узнать, когда пользователь только что провел пальцем влево/вправо, чтобы я мог справиться с этим.

Я просмотрел ссылку WKNavigationDelegate ( https://developer.apple.com/library/ios/documentation/WebKit/Reference/WKNavigationDelegate_Ref/ ), но я не нашел ничего полезного.

Есть идеи ?

ИЗМЕНИТЬ

Я забыл сказать, что я также пытался добавить распознаватели жестов смахивания таким образом:

    let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(MyVC.respondToSwipeLeftOrRight(_:)))
    swipeRight.direction = UISwipeGestureRecognizerDirection.Right
    let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(MyVC.respondToSwipeLeftOrRight(_:)))
    swipeLeft.direction = UISwipeGestureRecognizerDirection.Left
    self.view.addGestureRecognizer(swipeRight)
    self.view.addGestureRecognizer(swipeLeft)
    myWkWebView.scrollView.panGestureRecognizer.requireGestureRecognizerToFail(swipeRight)
    myWkWebView.scrollView.panGestureRecognizer.requireGestureRecognizerToFail(swipeLeft)

Но они не срабатывают каждый раз, когда я прокручиваю влево или вправо.


person Randy    schedule 16.05.2016    source источник


Ответы (3)


Вы должны иметь возможность сделать это с помощью своих распознавателей жестов, но вам нужно реализовать метод shouldRecognizeSimultaneouslyWithGestureRecognizer из UIGestureRecognizerDelegate, если вы хотите обрабатывать несколько распознавателей жестов в одном представлении:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}
person Vladimir K    schedule 16.05.2016
comment
Привет, Владимир, спасибо за ваш ответ, я уже реализовал этот метод, просто распознаватели жестов менее чувствительны, чем те, которые реализованы внутри WKWebView - person Randy; 16.05.2016
comment
Могу предположить, что методы requireGestureRecognizerToFail вызывают проблемы с чувствительностью. Их можно попробовать удалить, так как метод shouldRecognizeSimultaneousWithGestureRecognizer должен поддерживать все жесты. - person Vladimir K; 16.05.2016
comment
Куда это идет? Во вьюконтроллере? - person applecrusher; 11.12.2016

Увидев, что SinglePageApplication не будет работать, как говорит Стефан Рейн, мы могли бы включить связанное решение, проверив распознаватели жестов веб-представления.

[self.webView addObserver:self forKeyPath:@"URL" options:NSKeyValueObservingOptionNew context:nil];
//....
- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary<NSKeyValueChangeKey,id> *)change
                       context:(void *)context {
  if ([keyPath isEqualToString:@"URL"]) {    
    for (UIGestureRecognizer *recognizer in self.webView.gestureRecognizers) {
      if ([recognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        if (((UIPanGestureRecognizer*)recognizer).state == UIGestureRecognizerStateEnded) {
          NSLog(@"Swiped!");
        }
      }
    }
  }
}

Конечно, если у вас есть другие жесты, кроме двух для движения вперед и назад, вам может потребоваться выполнить дополнительные проверки.

person richy    schedule 14.01.2021

person    schedule
comment
Обратите внимание, что в SinglePageApplication с такой платформой, как angular, происходит только изменение маршрута, а WKWebView запускает свои функции только тогда, когда происходит полная загрузка страницы. stackoverflow.com/questions/47829963/ Это означает, что вы не получите здесь вызов метода, если будете перемещаться в угловом или ионном приложении. - person Stefan Rein; 22.05.2019