UIWebView的委托垂直滚动事件父,如果滚动到顶部或底部(UIWebView delegate

2019-07-29 16:27发布

我在UIScrollView的,这是一个分页的UIWebView。 基本上我想有滚动/一扔手势不同的网页视图之间切换。 水平正常工作。 如果web视图滚动到“页面边框”,滚动/平移事件被传递给滚动视图,从而显示下一页。 在垂直轴上,这是行不通的。 似乎没有被传递到了滚动的事件。 这可能是与弹跳,我禁用的问题,因为我认为,这将消耗该事件。 但即使有反弹禁用,这是行不通的。

我在一个滚动视图TextViews,这工作,也测试过这一点。 可能是网页视图的特殊行为。

任何想法,我是如何得到这个工作? 我一定要实现事件侦听器和手动传递事件滚动视图?

此外,如果你有更好的想法如何实现这种布局,让我知道。 正如我所说的,我希望有不同的看法,这可以通过一扔/滚动姿态被改变的网格。 类似于应用商店应用,其中一个应用程序的详细信息可以被垂直滚动和屏幕截图可以水平滚动。

干杯亨里克

Answer 1:

所以,我想它了。

首先,我设置web视图的委托,让我得到滚动事件,并可以检查,如果web视图滚动到顶部或底部:

- (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滚动型附加轻扫手势识别:

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]; 。 这些都是绝对必要的,因为没有他们,web视图的平移手势识别总是消耗的事件,他们到达滑动手势识别器前。 这些调用改变优先级。

在swipeUp和swipeDown方法,我计算下一个“页”的位置,然后滚动父滚动视图到这个位置,如果确实是下一个页面。

最后一点是,要检查,如果web视图滚动到顶部或底部,只接受在这种情况下手势。 为此,你必须实现手势识别的代表:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if(gestureRecognizer == swipeUp) {
        return webViewScrolledToBottom;
    } else if(gestureRecognizer == swipeDown) {
        return webViewScrolledToTop;
    }

    return false;
}

您可能还需要禁用滚动弹跳,以与网页,这些都让小这项工作,他们不滚动根本: webView.scrollView.bounces = false;



Answer 2:

难道真的有垂直滚动或者是web视图滚动视图? 我haven't没有尝试过自己,但也许这将帮助...

webView.scrollView.scrollEnabled = NO; 
webView.scrollView.bounces = NO;

要么 ...

webView.userInteractionEnabled = NO;


Answer 3:

我以前做过,但我使用JavaScript和OBJ - C的结束。 我补充说,检查(使用jQuery)如果页面底部或滚动(我需要的是我的应用程序)的顶部的功能。 然后,我打电话与使用的NSTimer该函数:

NSString *str= [webView stringByEvaluatingJavaScriptFromString:@"JSFunction()"];

我知道它的那种丑陋,但它是我发现的时候要做到这一点的唯一方法,它只是做的工作。 下面是我使用的代码:

function JSFunction() {
    var docHeight = $(document).height();
    var scroll    = $(window).height() + $(window).scrollTop();
    if (docHeight == scroll || $(window).scrollTop() < 10)
                 return "TOP";
            else
                 return "BODY";
}


文章来源: UIWebView delegate vertical scroll event to parent, if scrolled to top or bottom