【问题标题】:UIWebView delegate vertical scroll event to parent, if scrolled to top or bottomUIWebView 将垂直滚动事件委托给父级,如果滚动到顶部或底部
【发布时间】:2012-06-05 16:40:06
【问题描述】:

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

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

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

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

干杯 亨里克

【问题讨论】:

    标签: ios uiwebview uiscrollview


    【解决方案1】:

    真的是垂直滚动的scrollview还是webview? 我自己没有尝试过,但也许这会有所帮助......

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

    或者...

    webView.userInteractionEnabled = NO;
    

    【讨论】:

    • 这对我来说有点难以形容。它是 WebView,它首先滚动。现在,对于水平滚动,行为是,如果 webview 已到达文档侧,则滚动事件将传递给父滚动视图。在这种情况下,将打开下一个 webview。我希望在垂直轴上具有相同的行为,但此时 webview 滚动到顶部(或底部),然后什么也没有发生。禁用 webview 的滚动/用户交互对我来说是没有选择的,因为我仍然希望用户能够缩放和滚动 webview。
    【解决方案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";
    }
    

    【讨论】:

    • 也许您可以修改它以执行事件驱动,这样 Javascript 会通知用户在页面底部滚动。
    • 我有一些代码来检查webview是滚动到顶部还是底部,所以不需要javascript。但是,如果是这种情况,如何将滚动事件委托给父滚动视图?
    【解决方案3】:

    所以,我想通了。

    首先我设置了 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;

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      相关资源
      最近更新 更多