iOS:检测UIWebView到达顶部或底部
如何检测UIWebView达到顶部或底部? 因为当我到达底部时我需要触发一个动作。
那可以吗?
首先,你不应该把UIWebView
放在UIWebView
文档中提到的UIScrollView
中。
重要说明:您不应该在UIScrollView对象中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改变时实现或调用高性价比的函数!
下面是一个在包含UIWebView
的UIView
子类中做的代码示例:
@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中以检测滚动的结束/开始。
- 以编程方式将iPhone重置为出厂设置
- 加载要在UITableView cellForRowAtIndexPath中使用的数据
- 如何在swift中从带有dicitionary的数组中获取值?
- 设置包 – 默认值行为?
- 为什么UITableView的最后一个单元格的高度被用于剩余的空单元格?
- 如何使用requestReview(SKStore Review Controller)在随机时间段之后在当前viewController中显示审查popup窗口
- 如何以编程方式启用/禁用UICollectionView中的节标题?
- AFHTTPSessionManager将主体添加到POST
- NSLocalizedString作为NSDictionary的关键