iOS:检测UIWebView到达顶部或底部

如何检测UIWebView达到顶部或底部? 因为当我到达底部时我需要触发一个动作。

那可以吗?

首先,你不应该把UIWebView放在UIWebView文档中提到的UIScrollView中。

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

相反,您可以通过UIWebView属性访问UIScrollView 。 你的视图控制器可以实现UIScrollViewDelegate

 @interface MyViewController : UIViewController<UIScrollViewDelegate> @end 

然后你可以挂钩到UIScrollView:

 - (void)viewDidLoad { [super viewDidLoad]; // Set self as scroll view protocol webView.scrollView.delegate = self; } 

然后最后检测到正在达到的顶部和底部:

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if(scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)){ NSLog(@"BOTTOM REACHED"); } if(scrollView.contentOffset.y <= 0.0){ NSLog(@"TOP REACHED"); } } 

瞧,你可以检测什么时候到达顶部和底部。

如果你的目标iOS 5, UIWebView有一个只读的scrollView属性,允许你访问底层的UIScrollView

从那里,你可以钩入scrollView的scrollViewDidScroll: delegate方法来接收滚动事件的信息。

你可以给这个镜头 –

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if(scrollView == yourWebView) { int percentScrolled = abs((int)ceil((scrollView.contentOffset.y/scrollView.contentSize.height)*100)); if(percentScrolled > 100 || percentScrolled < 0) percentScrolled = 0; if(percentScrolled > 90) { //scroll percent is 90. do your thing here. } } return; } 

这里正在做的是每次用户滚动webView,计算%滚动和%滚动即将结束(说任何> 90%)做你打算做的任何事情。

你可以把UIWebView放在一个UIScrollView里面(它弹跳被禁用,所以视图的弹跳行为不会有任何冲突),然后当UIWebView滚动到底时,上面的UIScrollView将接pipe滚动,你可以听它的滚动事件。

刮那个。

似乎这不是那么简单。

您可以在UIWebView的子视图中findUIScrollView并使用其滚动委托方法。

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { NSLog(@"We scrolled! Offset now is %f, %f", scrollView.contentOffset.x, scrollView.contentOffset.y); } - (void)viewDidLoad { [super viewDidLoad]; UIWebView *view = (UIWebView *)self.view; for (UIView * subview in view.subviews) { if ([subview isKindOfClass:[UIScrollView class]]) { UIScrollView *webScrollView = (UIScrollView *)subview; webScrollView.delegate = self; break; } } [view loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://stackoverflow.com"]]]; } 

当UIWebView加载Web内容时,其UIScrollView应该更改其contentSize属性。 您可以使用它来确定您是否在底部或顶部。

您可以使用KVO来检测UIWebView实例的contentOffset属性中的任何更改。

警告:小心,因为这个属性在滚动时经常发生变化,下面的例子中的事件会经常popup。 不要在每个contentOffset改变时实现或调用高性价比的函数!

下面是一个在包含UIWebViewUIView子类中做的代码示例:

  @IBOutlet weak var webView: UIWebView! override func awakeFromNib() { super.awakeFromNib() webView.delegate = self webView.scrollView.addObserver(self, forKeyPath: "contentOffset", options: [.New, .Old], context: nil) } deinit { webView.scrollView.removeObserver(self, forKeyPath: "contentOffset", context: nil) } override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { guard let kp = keyPath else { super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) return } if kp == "contentOffset" { self.scrollViewDidScroll(webView.scrollView) } else { super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) } } func scrollViewDidScroll(scrollView: UIScrollView) { if scrollView.contentSize.height - scrollView.contentOffset.y - scrollView.frame.size.height < 100 { print("this is the end") } else if scrollView.contentOffset.y < 100 { print("this is the beginning") } } 

正如Apple在UIWebview文档中所logging的那样,您应该避免将UIWebview实例放在UIScrollView中以检测滚动的结束/开始。