それで、私はそれを理解しました。
最初に、webview のデリゲートを設定して、スクロール イベントを取得し、webview が上または下にスクロールされているかどうかを確認できるようにします。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if([scrollView isEqual:webView.scrollView]) {
float contentHeight = scrollView.contentSize.height;
float height = scrollView.frame.size.height;
float offset = scrollView.contentOffset.y;
if(offset == 0) {
webViewScrolledToTop = true;
webViewScrolledToBottom = false;
} else if(height + offset == contentHeight) {
webViewScrolledToTop = false;
webViewScrolledToBottom = true;
} else {
webViewScrolledToTop = false;
webViewScrolledToBottom = false;
}
//NSLog(@"Webview is at top: %i or at bottom: %i", webViewScrolledToTop, webViewScrolledToBottom);
}
}
次に、追加のスワイプ ジェスチャ レコグナイザーを webview の scrollview に登録しました。
swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeUp)];
swipeUp.direction = UISwipeGestureRecognizerDirectionUp;
swipeUp.delegate = self;
[self.webView.scrollView addGestureRecognizer:swipeUp];
[self.webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeUp];
swipeDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeDown)];
swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
swipeDown.delegate = self;
[self.webView.scrollView addGestureRecognizer:swipeDown];
[self.webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeDown];
への呼び出しに注目してください[self.webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeUp];
。それらがないと、webview のパン ジェスチャ レコグナイザーは、イベントがスワイプ ジェスチャ レコグナイザーに到達する前に常にイベントを消費するため、これらは絶対に必要です。これらの呼び出しは優先順位を変更します。
swipeUp メソッドと swipeDown メソッドでは、次の「ページ」の位置を計算し、実際に次のページがある場合は、親スクロール ビューをこの位置までスクロールします。
最後に、webview が上または下にスクロールされているかどうかを確認し、その場合にのみジェスチャーを受け入れるようにします。そのため、ジェスチャ認識エンジンのデリゲートを実装する必要があります。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if(gestureRecognizer == swipeUp) {
return webViewScrolledToBottom;
} else if(gestureRecognizer == swipeDown) {
return webViewScrolledToTop;
}
return false;
}
非常に小さいため、まったくスクロールされない Web ページでこれを機能させるには、スクロール バウンスを無効にする必要がある場合もあります。webView.scrollView.bounces = false;