检查UIWebView是否滚动到底部

时间:2012-01-13 21:45:45

标签: iphone objective-c ios ipad

滚动时,当用户位于UIWebView的底部时,如何检查/调用方法?当用户位于内容的底部时,我想弹出一个视图(添加一个子视图)。

5 个答案:

答案 0 :(得分:1)

在此处基于其他想法,UIWebView符合UIScrollViewDelegate协议。您可以继承UIWebView并覆盖相应的UIScrollViewDelegate方法,调用[super ...]以便原始行为仍然存在。

@interface SpecialWebview : UIWebView

@end

@implementation SpecialWebview

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    [super scrollViewDidScroll:scrollView];

    // Check scroll position and handle events as needed...
}

@end

答案 1 :(得分:0)

首先使用此属性获取对UIWebView scrollView的引用:

@property(nonatomic, readonly, retain) UIScrollView *scrollView

获得对它的引用后,您可以检查它的contentSize并将其与contentOffSet进行比较。你不能让自己成为它的委托,因为UIWebView已经是scrollView的委托,但这个技巧应该有用。

问题是当滚动发生时你没有得到callBack ......所以你必须经常检查。否则,您必须使自己成为scrollView的委托,并实现UIWebView正在实现的所有方法并模仿该行为,然后检查didScroll是否存在该条件。

答案 2 :(得分:0)

另一种选择是将一些JavaScript注入Web视图,然后使用JavaScript中的window.onscroll事件来检测用户何时滚动到窗口底部(如果检测到滚动事件,您可以在线找到大量示例使用JS)。

一旦您检测到用户位于底部,您可以通过在document.location.href =“http:// madeupcallbackurl”中填写来自JavaScript的Web视图中的假网址来回调应用程序,然后使用Web视图委托来拦截该请求并执行您的本机代码逻辑。

如果你能做到这一点,使用scrollview委托可能更容易!

答案 3 :(得分:0)

抱歉,我在想UITableView。您在询问UIWebView。我不知道这是否适用于UIWebView。

我有使用UIScrollViewDelegate执行此操作的代码。

@interface myViewController : UIViewController_iPad <UIScrollViewDelegate> {
    UITableView *myTableView;
    ...
}

- (void)viewDidLoad {
    myTableView.delegate = self;
    ...
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // If necessary, verify this scrollview is your table:
    // if (scrollView == myTableView) {
        CGPoint offset = myTableView.contentOffset;
        if (myTableView.contentSize.height - offset.y >= myTableView.bounds.size.height)
        {
            // The table scrolled to the bottom. Do your stuff...
        }
    // }
}

答案 4 :(得分:0)

我就是这样做的。

UIWebView符合UIScrollViewDelegate。使用- (void)scrollViewDidScroll:(UIScrollView *)scrollView回调来跟踪UIWebView滚动的时间:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
   //The webview is is scrolling
   int xPosition = [[webView stringByEvaluatingJavaScriptFromString: @"scrollX"] intValue];
   int yPosition = [[webView stringByEvaluatingJavaScriptFromString: @"scrollY"] intValue];
}

现在,只要您的webView滚动,就会调用此方法。在以下情况下,您的webView将滚动到底部:

<强> webView_content_height - webView(y) = webView.frame.height; //pseudo code

您的委托回调现在将如下所示:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
       //The webview is is scrolling
       int xPosition = [[webView stringByEvaluatingJavaScriptFromString: @"scrollX"] intValue];
       int yPosition = [[webView stringByEvaluatingJavaScriptFromString: @"scrollY"] intValue];

       if([webView stringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight"] - yPosition == webView.frame.height)
       {
            //The user scrolled to the bottom of the webview
       }
    }

代码转换为当用户滚动到内容的底部时,webView的y Position(即webView左上角的y坐标)与内容底部之间的差异将是等于webview框架的高度。代码作用于满足此条件以进入if条件。

为了安全起见,您可以修改if条件以获得错误余量(可能是+或 - 10像素)。