如何将UIWebView的滚动转发到UIScrollView?(有条件地)

7
我在UIScrollView中嵌入了一个UIWebView。
这个想法是当用户向上滚动网页时,通过将UIScrollView向上滚动直到工具栏可见来在屏幕上创建更多的阅读空间,当工具栏不再可见时,实际上滚动网页以显示页面上的更多内容。
iPhone Safari浏览器正好具有相同的功能。
查看默认行为的截图(第一张),我猜是因为:滚动消息被webview消耗掉了,因为触摸/滚动是直接发生在webview区域上。
我想做的是,在编程上决定何时将“向上滚动”转发到UIScrollivew,何时不转发。
任何关于如何解决这个问题的提示都会非常有帮助。谢谢!
3个回答

2

UIWebView类参考不建议将UIWebView嵌入UIScrollView中:

重要提示:您不应将UIWebView或UITableView对象嵌入UIScrollView对象中。如果这样做,可能会导致意外行为,因为两个对象的触摸事件可能会混淆和错误处理。

然而,我想你仍然想实现你的功能;-)

思路1:不要将UIWebView嵌入UIScrollView中,而是使用UIWebView的stringByEvaluatingJavaScriptFromString:方法运行JavaScript,修改DOM以添加下方的工具栏。如果需要,在任何按钮被按下时,您可以通过注册一些自定义URL方案来回调Objective-C代码。

想法2:不要将UIWebView嵌入UIScrollView中,而是嵌入普通的UIView中。在Vignesh的建议基础上,通过代理监听webView的内部scrollView的scrollViewDidScroll:回调,每次调用回调时检查contentOffset与contentSize高度的大小关系。一旦它们相等,就意味着到达了底部。一旦发生这种情况,您可以动画地调整工具栏的框架以“进入”包含UIView并“推开”webView的框架。
想法3:忽略苹果的建议,在UIScrollView中嵌入UIWebView。在Vignesh的建议上进行改进,通过委托监听webView的内部scrollView的scrollViewDidScroll:回调,每次调用回调时检查contentOffset与contentSize的高度比较。一旦它们相等,就意味着你到达了底部。此时将webView的userInteractionEnabled属性设置为NO,并在包含webView和工具栏的scrollView上将其设置为YES。希望滚动会足够平稳。当然,你还必须以同样的方式监听包含滚动视图,以确定何时切换回userInteractionEnabled。
这个想法的一个变化是只将userInteractionEnabled设置为NO,但将webView的frame的高度设置为匹配其contentSize,并相应地扩大包含scrollView的contentSize。
这两种变化都有缺点,在某些情况下,你可能无法执行诸如单击链接之类的操作 :-( 但也许对于你的情况来说这已经足够了。至少在第一种变化中,情况并不那么糟糕。

0
您可以在UIscrollview中一个接一个地添加搜索框和uiwebview。要在webview滚动时获取内容偏移量,可以使用以下代码片段。
UIScrollView* currentScrollView;
for (UIView* subView in testWebView.subviews) {
    if ([subView isKindOfClass:[UIScrollView class]]) {
        currentScrollView = (UIScrollView*)subView;
        currentScrollView.delegate = (id)self;
    }
}

现在,您可以将基本滚动视图偏移的y值更改为从滚动视图didscroll委托方法获取的偏移值。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接