How to disable scrolling entirely in a WKWebView?

前端 未结 10 1702
再見小時候
再見小時候 2020-12-28 14:07

I know this looks like a simple question one can simply say:

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


        
10条回答
  •  遥遥无期
    2020-12-28 15:04

    Took me a while but I figured out a way of doing this.

    I had to remove a private gesture recognizer within a private subview of the WKWebView.

    I had a category on WKWebView to do so:

    @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
    

    Hope this helps anyone some day.

提交回复
热议问题