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

我有一个UIWebView里面的UIScrollView

这个想法是为了能够在用户向上滚动网页时在屏幕上创build更多的阅读空间 – 通过向上滚动UIScrollView直到工具栏可见,并且显然当工具栏是可见的时,实际上滚动网页以显示更多的内容页。

iPhone Safari浏览器的function完全相同。

看到屏幕截图(第一)我得到的默认行为 – 我想是因为:滚动消息是由Web视图消耗,因为触摸/滚动直接发生在Web视图区域。

我想在这里做什么是programatiicaly决定何时将“向上滚动”转发到UIScrollivew和什么时候不。

有关如何解决这个问题的任何提示将非常有帮助。 谢谢!!

在这里输入图像说明

在这里输入图像说明

UIWebView类参考不鼓励在UIScrollView中embedded一个UIWebView:

重要说明:您不应该在UIS​​crollView对象中embeddedUIWebView或UITableView对象。 如果这样做,可能会导致意外的行为,因为两个对象的触摸事件可能会混淆并被错误地处理。

不过,我想你还是想实现你的function;-)

想法1 :不要将UIWebViewembedded到UIScrollView中,而是使用UIWebView的stringByEvaluatingJavaScriptFromString:方法运行javascript,修改DOM以在下面添加工具栏。 如果需要,您可以通过注册一些自定义URLscheme来从工具栏上推送的任何buttoncallbackObjective-C代码。

想法2 :不要将UIWebViewembedded到UIScrollView中,而是embedded到普通的UIView中。 build立在Vignesh的build议,听取您的webView的内部scrollView的scrollViewDidScroll:通过委托callback, scrollViewDidScroll:调用callback检查contentOffsetcontentSize的高度。 一旦它们平等,就意味着你已经到底了。 一旦发生这种情况,您可以animation工具栏的框架“进入”包含的UIView和“推”“webView的框架。

想法3 :忽略苹果的build议,并将UIWebViewembedded到UIScrollView中。 build立在Vignesh的build议,听取您的webView的内部scrollView的scrollViewDidScroll:通过委托callback, scrollViewDidScroll:调用callback检查contentOffsetcontentSize的高度。 一旦它们平等,就意味着你已经到底了。 一旦发生这种情况,请将webView的userInteractionEnabled属性设置为NO,并在包含webView和工具栏的scrollView上将其设置为YES。 希望滚动将继续顺利。 当然,您必须以相同的方式来侦听包含滚动视图,以确定何时切换回userInteractionEnabled

这个想法的一个变种是将userInteractionEnabled设置的userInteractionEnabled设置为NO,但是设置webView框架的高度以匹配其contentSize,并且相应地放大包含scrollView的contentSize。

这两种变化都有缺点,在某些情况下,你将无法做到诸如点击链接之类的事情:(但是,对于你的情况来说,这可能是足够好的了,至less在第一个变化中并不是那么糟糕。

你可以添加一个search框和uiwebview在一个下面的UIscrollview。 要在webview滚动时获取内容偏移量,可以使用以下代码片段。

 UIScrollView* currentScrollView; for (UIView* subView in testWebView.subviews) { if ([subView isKindOfClass:[UIScrollView class]]) { currentScrollView = (UIScrollView*)subView; currentScrollView.delegate = (id)self; } } 

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