如何转发UIWebView滚动到UIScrollView? (有条件的)
我有一个UIWebView里面的UIScrollView 。
这个想法是为了能够在用户向上滚动网页时在屏幕上创build更多的阅读空间 – 通过向上滚动UIScrollView直到工具栏可见,并且显然当工具栏是可见的时,实际上滚动网页以显示更多的内容页。
iPhone Safari浏览器的function完全相同。
看到屏幕截图(第一)我得到的默认行为 – 我想是因为:滚动消息是由Web视图消耗,因为触摸/滚动直接发生在Web视图区域。
我想在这里做什么是programatiicaly决定何时将“向上滚动”转发到UIScrollivew和什么时候不。
有关如何解决这个问题的任何提示将非常有帮助。 谢谢!!
UIWebView类参考不鼓励在UIScrollView中embedded一个UIWebView:
重要说明:您不应该在UIScrollView对象中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检查contentOffset
与contentSize
的高度。 一旦它们平等,就意味着你已经到底了。 一旦发生这种情况,您可以animation工具栏的框架“进入”包含的UIView和“推”“webView的框架。
想法3 :忽略苹果的build议,并将UIWebViewembedded到UIScrollView中。 build立在Vignesh的build议,听取您的webView的内部scrollView的scrollViewDidScroll:
通过委托callback, scrollViewDidScroll:
调用callback检查contentOffset
与contentSize
的高度。 一旦它们平等,就意味着你已经到底了。 一旦发生这种情况,请将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委托方法获得的偏移值。
先进的ScrollView技术