4

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

我之前在滚动视图中使用 TextViews 对此进行了测试,这也有效。可能是 webviews 的一种特殊行为。

任何想法,我如何让它工作?我是否必须实现事件侦听器并将事件手动传递给滚动视图?

此外,如果您对如何实现这种布局有更好的了解,请告诉我。正如我所说,我想要一个不同视图的网格,可以通过滑动/滚动手势进行更改。与 AppStore 应用程序类似,应用程序的详细信息可以垂直滚动,屏幕截图可以水平滚动。

干杯亨利克

4

3 回答 3

9

所以,我想通了。

首先,我设置了 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];。这些是绝对必要的,因为没有它们,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;

于 2012-06-09T14:17:59.367 回答
4

它真的是垂直滚动的滚动视图还是网络视图?我自己没有尝试过,但也许这会有所帮助......

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

或者 ...

webView.userInteractionEnabled = NO;
于 2012-06-06T07:44:42.813 回答
2

我以前做过,但我最终使用了 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";
}
于 2012-06-09T00:44:06.490 回答