iOS: обнаружение UIWebView, достигающего вершины или основания - PullRequest
10 голосов
/ 02 марта 2012

Как я могу определить, как UIWebView достигает вершины или низа? Потому что мне нужно вызвать действие, когда я достигну дна.

Так это выполнимо?

Ответы [ 6 ]

24 голосов
/ 05 апреля 2013

Прежде всего, вы не должны помещать ваш UIWebView в UIScrollView, как указано в документации UIWebView.

Внимание! Не следует встраивать объекты UIWebView или UITableView в объекты UIScrollView.В этом случае может возникнуть непредвиденное поведение, поскольку события касания для двух объектов могут быть смешаны и неправильно обработаны.

Вместо этого вы можете получить доступ к UIScrollView через свойства UIWebView.Ваш контроллер представления может реализовать 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");
    }
}

Вуаля, вы можете определить, когда достигнут верх и низ.

2 голосов
/ 02 марта 2012

Вы можете попробовать -

- (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%)делай все, что планировал.

2 голосов
/ 02 марта 2012

Если вы ориентируетесь на iOS 5, UIWebView имеет свойство только для чтения scrollView, которое позволяет вам получить доступ к базовому UIScrollView.

Оттуда вы можете подключиться к scrollView scrollViewDidScroll: метод делегата для получения информации о событиях прокрутки.

1 голос
/ 02 марта 2012

Вы могли бы поместить UIWebView в UIScrollView (у которого отключен отскок, чтобы поведение отказов просмотров не конфликтовало ни в коем случае), а затем, когда UIWebView прокручивается вниз, UIScrollView выше перехватит прокрутку, и вы может прослушивать события прокрутки.

Поцарапайте это.

Кажется, что все не так просто.

Вы можете найти UIScrollView среди подпредставлений UIWebView и нажать на его методы делегата прокрутки.

- (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 загружает веб-контент, его UIScrollView должен изменить свое свойство contentSize. Вы можете использовать это, чтобы определить, находитесь ли вы внизу или уже вверху или нет.

0 голосов
/ 19 октября 2018

Если вы используете Wkwebview:

Я немного опоздал, я реализовал делегат wkwebview для проверки досягаемости прокрутки сверху или снизу. Я использовал для чтения кода javascript через Функция оценки JavaScript .Перед использованием установите scrollview делегата вашего веб-просмотра и реализуйте scrollViewDidEndDragging делегат функцию UIScrollViewDelegate

extension BaseWebViewController: UIScrollViewDelegate {
func scrollViewDidEndDragging(_ scrollView: UIScrollView,
                                   willDecelerate decelerate: Bool) {
webView.evaluateJavaScript("document.readyState", completionHandler: { (complete, error) in
    if complete != nil {
        self.webView.evaluateJavaScript("document.body.scrollHeight", completionHandler: { (height, error) in
            let bodyScrollHeight = height as! CGFloat
            var bodyoffsetheight: CGFloat = 0
            var htmloffsetheight: CGFloat = 0
            var htmlclientheight: CGFloat = 0
            var htmlscrollheight: CGFloat = 0
            var wininnerheight: CGFloat = 0
            var winpageoffset: CGFloat = 0
            var winheight: CGFloat = 0

            //body.offsetHeight
            self.webView.evaluateJavaScript("document.body.offsetHeight", completionHandler: { (offsetHeight, error) in
                bodyoffsetheight = offsetHeight as! CGFloat

                self.webView.evaluateJavaScript("document.documentElement.offsetHeight", completionHandler: { (offsetHeight, error) in
                    htmloffsetheight = offsetHeight as! CGFloat

                    self.webView.evaluateJavaScript("document.documentElement.clientHeight", completionHandler: { (clientHeight, error) in
                        htmlclientheight = clientHeight as! CGFloat

                        self.webView.evaluateJavaScript("document.documentElement.scrollHeight", completionHandler: { (scrollHeight, error) in
                            htmlscrollheight = scrollHeight as! CGFloat

                            self.webView.evaluateJavaScript("window.innerHeight", completionHandler: { (winHeight, error) in
                                if error != nil {
                                    wininnerheight = -1
                                } else {
                                    wininnerheight = winHeight as! CGFloat
                                }

                                self.webView.evaluateJavaScript("window.pageYOffset", completionHandler: { (winpageOffset, error) in
                                    winpageoffset = winpageOffset as! CGFloat

                                    let docHeight = max(bodyScrollHeight, bodyoffsetheight, htmlclientheight, htmlscrollheight,htmloffsetheight)

                                    winheight = wininnerheight >= 0 ? wininnerheight : htmloffsetheight
                                    let winBottom = winheight + winpageoffset
                                    if (winBottom >= docHeight) {
                                        print("end scrolling")
                                    } else if winpageoffset == 0 {
                                            print("top of webview")
                                        }
                                })

                            })

                        })

                    })

                })
            })


        })
    }

})

}
}
0 голосов
/ 16 июня 2016

Вы можете использовать KVO для обнаружения любых изменений в свойстве contentOffset вашего UIWebView экземпляра.

Предупреждение: будьте осторожны, так как это свойство очень часто меняется при прокрутке, а события в приведенном ниже примере будут появляться очень часто. Не применяйте и не вызывайте дорогостоящую функцию при каждом изменении contentOffset!

Вот пример кода для этого в подклассе UIView, содержащем UIWebView:

    @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, вам следует избегать размещения своего экземпляра UIWebview в UIScrollView для определения конца / начала прокрутки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...