如何在WKWebView中完全禁用滚动?

apo*_*che 17 webview ios

我知道这看起来像一个简单的问题,可以简单地说:

webview.scrollView.scrollEnabled = NO;
webview.scrollView.panGestureRecognizer.enabled = NO;
webview.scrollView.bounces = NO;
Run Code Online (Sandbox Code Playgroud)

甚至

for (UIView* subview in webview.subviews) {
  if ([subview respondsToSelector:@selector(setScrollEnabled:)]) {
      [(id)subview setScrollEnabled:enabled];
  }

  if ([subview respondsToSelector:@selector(panGestureRecognizer)]) {
      [[(id)subview panGestureRecognizer] setEnabled:enabled];
  }
}
Run Code Online (Sandbox Code Playgroud)

虽然它确实防止了contentOffset内部的scolling(在意义上),但WKWebview并没有阻止它接收涉及滚动的平移手势事件.

因此,当用户向左或向右滚动时,包含javascript以自动更改文章的Huffington Post的文章仍然会得到该行为.

我怎么能阻止这个?

Bor*_*zin 34

在Swift之前3

您可以简单地禁用其隐式scrollView上的滚动

webView.scrollView.scrollEnabled = false
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

webView.scrollView.isScrollEnabled = false
Run Code Online (Sandbox Code Playgroud)

  • 在Swift 3中,这对我有用:`webView.scrollView.isScrollEnabled = false` (8认同)
  • 我喜欢你甚至可能都没有读过我原来的问题 (6认同)

apo*_*che 6

我花了一段时间,但我找到了一种方法.

我不得不在私人子视图中删除私人手势识别器WKWebView.

我有一个类别WKWebView:

@implementation WKWebView (Scrolling)

- (void)setScrollEnabled:(BOOL)enabled {
    self.scrollView.scrollEnabled = enabled;
    self.scrollView.panGestureRecognizer.enabled = enabled;
    self.scrollView.bounces = enabled;

    // There is one subview as of iOS 8.1 of class WKScrollView
    for (UIView* subview in self.subviews) {
        if ([subview respondsToSelector:@selector(setScrollEnabled:)]) {
            [(id)subview setScrollEnabled:enabled];
        }

        if ([subview respondsToSelector:@selector(setBounces:)]) {
            [(id)subview setBounces:enabled];
        }

        if ([subview respondsToSelector:@selector(panGestureRecognizer)]) {
            [[(id)subview panGestureRecognizer] setEnabled:enabled];
        }

        // here comes the tricky part, desabling
        for (UIView* subScrollView in subview.subviews) {
            if ([subScrollView isKindOfClass:NSClassFromString(@"WKContentView")]) {
                for (id gesture in [subScrollView gestureRecognizers]) {
                    if ([gesture isKindOfClass:NSClassFromString(@"UIWebTouchEventsGestureRecognizer")])
                        [subScrollView removeGestureRecognizer:gesture];
                }
            }
        }
    }

}


@end
Run Code Online (Sandbox Code Playgroud)

希望有一天能帮到任何人.


ala*_*n.s 5

致谢,非常感谢apouche提供的Obj-C代码。如果其他人有相同的问题,这是适用于Swift 2的工作解决方案

extension WKWebView {

  func setScrollEnabled(enabled: Bool) {
    self.scrollView.scrollEnabled = enabled
    self.scrollView.panGestureRecognizer.enabled = enabled
    self.scrollView.bounces = enabled

    for subview in self.subviews {
        if let subview = subview as? UIScrollView {
            subview.scrollEnabled = enabled
            subview.bounces = enabled
            subview.panGestureRecognizer.enabled = enabled
        }

        for subScrollView in subview.subviews {
            if subScrollView.dynamicType == NSClassFromString("WKContentView")! {
                for gesture in subScrollView.gestureRecognizers! {
                    subScrollView.removeGestureRecognizer(gesture)
                }
            }
        }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


3CC*_*3CC -1

尝试以这种方式禁用scrollView缩放:

CGFloat zoomScale = webview.scrollView.zoomScale;
webview.scrollView.maximumZoomScale = zoomScale;
webview.scrollView.minimumZoomScale = zoomScale;
Run Code Online (Sandbox Code Playgroud)