检查UIWebView是否滚动到底部
当用户在滚动时位于UIWebView的底部时,如何检查/调用方法? 我想在用户位于内容的底部时popup一个视图(添加一个子视图)。
在这里构build其他的想法, 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
首先使用此属性获取对UIWebView scrollView的引用:
@property(nonatomic, readonly, retain) UIScrollView *scrollView
一旦你得到它的引用,你可以检查它的contentSize并将其与contentOffSet进行比较。 你不能让自己成为委托,因为UIWebView已经是scrollView的委托了,但是这个技巧应该可以工作。
问题是,当滚动发生时,你不会得到callback…所以你必须经常检查。 否则,你将不得不使自己成为scrollView的委托,并实现UIWebView正在实现的所有方法,并模仿该行为,然后检查didScroll
的条件。
另一个select是将一些JavaScript注入到Web视图中,然后使用JavaScript中的window.onscroll事件来检测用户何时滚动到窗口底部(如果使用JS检测滚动事件,可以在线find大量示例) 。
一旦你检测到用户在底部,你可以通过从document.location.href =“http:// madeupcallbackurl”加载一个假的url在JavaScript的web视图中加载一个假的url,然后使用web查看委托来拦截该请求并执行您的本机代码逻辑。
使用scrollview委托可能更容易,但如果你能做到这一点!
对不起,我在想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... } // } }
这是我将如何做到这一点。
UIWebView
符合UIScrollViewDelegate
。 使用- (void)scrollViewDidScroll:(UIScrollView *)scrollView
callback来跟踪你的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
您的委托callback将如下所示:
- (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位置(这是webView的左上angular的y坐标)和内容的底部之间的差异将等于webview框架的高度。 代码作用于条件满足条件内进入。
为了安全起见,您可以修改if
条件以便有误差(可能是+或 – 10像素)。