【问题标题】:How to disable scrolling entirely in a WKWebView?如何在 WKWebView 中完全禁用滚动?
【发布时间】:2015-04-22 06:28:45
【问题描述】:

我知道这看起来是一个简单的问题:

webview.scrollView.scrollEnabled = NO;
webview.scrollView.panGestureRecognizer.enabled = NO;
webview.scrollView.bounces = NO;

甚至

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];
  }
}

但虽然它确实阻止了 WKWebview 内的滑动(在 contentOffset 的含义中),但 阻止它接收涉及滚动的平移手势事件。

因此,像《赫芬顿邮报》这样的文章,其中包含 javascript 以在用户向左或向右滚动时自动更改文章,仍然会出现这种行为。

如何防止这种情况发生?

【问题讨论】:

    标签: ios webview


    【解决方案1】:

    斯威夫特 5

    disableScrollView(self.webView)
    
    func disableScrollView(_ view: UIView) {
        (view as? UIScrollView)?.isScrollEnabled = false
        view.subviews.forEach { disableScrollView($0) }
    }
    

    【讨论】:

      【解决方案2】:

      在 Swift 3 之前

      您可以简单地在其隐式滚动视图上禁用滚动

      webView.scrollView.scrollEnabled = false
      

      斯威夫特 3

      webView.scrollView.isScrollEnabled = false
      

      【讨论】:

      • 在 Swift 3 中这对我有用:webView.scrollView.isScrollEnabled = false
      • 我喜欢你可能甚至没有阅读我原来的问题
      【解决方案3】:

      这是基于 alain.s 的 swift 解决方案(基于 apouche 的解决方案)的 WKWebView 的 C# 扩展,适用于我们这些使用 Xamarin 的人。我在我的应用程序中使用它。

      显着的区别是我在循环之前检查子视图是否存在,而不是动态地寻找“WKContentView”(我不确定在 Xamarin 中是否可能)我只是检查每个子视图是否有 GestureRecognizers 并删除它们。这显然会禁用所有类型的手势,因此如果您希望用户与 Web 内容进行任何交互,请考虑这一点。

      public static class WKWebViewExtension
          {
              public static void DisableScroll(this WebKit.WKWebView webView)
              {
                  webView.ScrollView.ScrollEnabled = false;
                  webView.ScrollView.PanGestureRecognizer.Enabled = false;
                  webView.ScrollView.Bounces = false;
      
                  if (webView.Subviews != null)
                  {
                      foreach (var subView in webView.Subviews)
                      {
                          if (subView is UIScrollView)
                          {
                              UIScrollView subScrollView = (UIScrollView)subView;
      
                              subScrollView.ScrollEnabled = false;
                              subScrollView.Bounces = false;
                              subScrollView.PanGestureRecognizer.Enabled = false;
                          }
      
                          if (subView.Subviews != null)
                          {
                              foreach (var subScrollView in subView.Subviews)
                              {
                                  if (subScrollView.GestureRecognizers != null)
                                  {
                                      foreach (var gesture in subScrollView.GestureRecognizers)
                                      {
                                          subScrollView.RemoveGestureRecognizer(gesture);
                                      }
                                  }
                              }
                          }
      
      
                      }
                  }
              }
          }
      

      【讨论】:

        【解决方案4】:

        我发现我必须将我的视图控制器设为UIScrollViewDelegate,然后添加此功能以防止滚动。

        func scrollViewDidScroll(_ scrollView: UIScrollView) {
           scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
        }
        

        【讨论】:

          【解决方案5】:

          这是一个 Swift 3 版本:

          extension WKWebView {
          
              func setScrollEnabled(enabled: Bool) {
                  self.scrollView.isScrollEnabled = enabled
                  self.scrollView.panGestureRecognizer.isEnabled = enabled
                  self.scrollView.bounces = enabled
          
                  for subview in self.subviews {
                      if let subview = subview as? UIScrollView {
                          subview.isScrollEnabled = enabled
                          subview.bounces = enabled
                          subview.panGestureRecognizer.isEnabled = enabled
                      }
          
                      for subScrollView in subview.subviews {
                          if type(of: subScrollView) == NSClassFromString("WKContentView")! {
                              for gesture in subScrollView.gestureRecognizers! {
                                  subScrollView.removeGestureRecognizer(gesture)
                              }
                          }
                      }
                  }
              }
          }
          

          【讨论】:

            【解决方案6】:

            终于 self.webView.scrollView.userInteractionEnabled = 否

            【讨论】:

            • 它还可以防止点击等触摸事件。
            【解决方案7】:

            感谢 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)
                            }
                        }
                    }
                }
              }
            }
            

            【讨论】:

              【解决方案8】:

              如果有人仍然遇到此问题,这里是一个快速版本

              let subviews = self.theWebView.scrollView.subviews
                 for subview in subviews{
                    if(subview.isKindOfClass(NSClassFromString("WKContentView"))){
                              if let recognizers = subview.gestureRecognizers {
                                  for recognizer in recognizers! {
                                      if recognizer.isKindOfClass(NSClassFromString("UIWebTouchEventsGestureRecognizer")){
                                         subview.removeGestureRecognizer(recognizer as! UIGestureRecognizer)
                                      }
                                  }
                              }
                          }
                      }
              

              【讨论】:

                【解决方案9】:

                花了我一段时间,但我想出了一个办法。

                我必须在 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
                

                希望有一天这对任何人都有帮助。

                【讨论】:

                  【解决方案10】:

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

                  CGFloat zoomScale = webview.scrollView.zoomScale;
                  webview.scrollView.maximumZoomScale = zoomScale;
                  webview.scrollView.minimumZoomScale = zoomScale;
                  

                  【讨论】:

                    猜你喜欢
                    • 2011-06-06
                    • 2017-10-13
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-07-05
                    • 2013-05-14
                    • 1970-01-01
                    相关资源
                    最近更新 更多