如果滚动到顶部或底部,UIWebView将垂直滚动事件委托给父级

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

我之前用TextViews在scrollview中testing过了,它也能工作。 可能是webviews的特殊行为。

任何想法,我如何得到这个工作? 我是否必须实现事件监听器并将事件手动传递给滚动视图?

此外,如果您对如何实施这种布局有更好的了解,请告诉我。 正如我所说,我想有一个不同的意见,可以通过一举两得/滚动手势来改变网格。 与AppStore应用类似,应用的细节可以垂直滚动,屏幕截图可以水平滚动。

干杯亨里克

所以,我明白了。

首先我设置了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的滚动视图上注册了额外的滑动手势识别器:

 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];的调用[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; } 

您可能还必须禁用滚动反弹,以使这个网页,它是如此之小,根本不滚动webView.scrollView.bounces = false;

它真的是scrollview垂直滚动还是它的web视图? 我还没有尝试过,但也许这将有助于…

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

要么 …

 webView.userInteractionEnabled = NO; 

我以前做过这个,但是我结束了使用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"; }