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

时间:2011-10-09 02:02:16

标签: ios uiwebview uiscrollview

我在 UIScrollView 中有一个 UIWebView

这个想法是当用户向上滚动网页时能够在屏幕上创建更多阅读空间 - 向上滚动UIScrollView直到工具栏可见,显然当工具栏被称为可见时,实际上滚动网页以显示页面上的更多内容。

IPhone Safari浏览器具有完全相同的功能。

查看截图(第一个)我得到的默认行为 - 我猜是因为:滚动消息由webview消耗,因为触摸/滚动直接发生在webview区域。

我想在这里做的是编程决定何时将“向上滚动”转发到UIScrollivew以及何时不转发。

如何解决这个问题的任何提示都会非常有用。谢谢!

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:2)

UIWebView class reference不鼓励在UIScrollView中嵌入UIWebView:

  

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

但是我想你仍然想要实现你的功能;-)

创意1 :不要在UIScrollView中嵌入UIWebView,而是使用UIWebView的stringByEvaluatingJavaScriptFromString:方法运行javascript,修改DOM以在下面添加工具栏。如果需要,您可以通过注册一些自定义URL方案从工具栏上推送的任何按钮回调objective-c代码。

创意2 :不要在UIScrollView中嵌入UIWebView,而是在普通的UIView中嵌入。在Vignesh的建议的基础上,通过委托监听webView的内部scrollView的scrollViewDidScroll:回调,每次调用回调时检查contentOffsetcontentSize的高度。一旦它们相等,就意味着你到底了。一旦发生这种情况,您可以设置工具栏框架的动画,以“输入”包含UIView并“推送”webView的框架。

创意3 :忽略Apple的推荐,并将UIWebView嵌入到UIScrollView中。在Vignesh的建议的基础上,通过委托监听webView的内部scrollView的scrollViewDidScroll:回调,每次调用回调时检查contentOffsetcontentSize的高度。一旦它们相等,就意味着你到底了。一旦发生这种情况,请将webView的userInteractionEnabled属性设置为NO,并在包含webView和工具栏的scrollView上将其设置为YES。希望卷轴能够继续顺利进行。当然,您必须以相同的方式收听包含滚动视图,以确定何时切换回userInteractionEnabled

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

这两种变体都有一个缺点,就是在某些情况下你不能做点击链接之类的事情:-(但也许这对你的情况来说已经足够了。至少在第一个版本中它并不是那么糟糕。< / p>

答案 1 :(得分: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值更改为您从scrollview didscroll委托方法获得的偏移值。

答案 2 :(得分:0)