Проверьте, прокручивается ли UIWebView на дно

Как проверить/вызвать метод, когда пользователь находится в нижней части UIWebView при прокрутке? Я хочу, чтобы всплывающее окно (добавить subiview), когда пользователь находится в нижней части содержимого.

5 ответов

Основываясь на других идеях здесь, 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


Еще одним вариантом было бы добавить некоторый JavaScript в веб-представление, а затем использовать событие window.onscroll в JavaScript, чтобы определить, когда пользователь прокручивается в нижней части окна (вы можете найти множество примеров в Интернете, если обнаруживаете события прокрутки с помощью JS),

Как только вы обнаружите, что пользователь находится внизу, вы можете вернуться к приложению, загрузив поддельный URL-адрес в веб-представление из JavaScript, указав document.location.href= "http://*****************", а затем используйте веб-сайт просмотреть делегата, чтобы перехватить этот запрос и выполнить свою собственную логику кода.

Использование делегата scrollview, вероятно, проще, но если вы можете сделать эту работу!


Вот как я это сделаю.

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_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 (которая является y-координатой верхнего левого угла webView) и нижней частью содержимого будет равна высота рамки веб-просмотра. Код действует на выполнение этого условия, чтобы войти в условие if.

Чтобы быть в безопасности, вы можете изменить условие if чтобы иметь допустимый запас для ошибки (возможно, + или - 10 пикселей).


Сначала получите ссылку на scrollView UIWebView, используя это свойство:

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

Как только вы получите ссылку на него, вы можете проверить его содержимое и сравнить его с contentOffSet. Вы не можете сделать его делегатом, поскольку UIWebView уже является делегатом для scrollView, но этот трюк должен работать.

Проблема в том, что вы не получаете callBack, когда происходит прокрутка... так что вам нужно будет проверять все так часто. В противном случае вам придется сделать себя делегатом scrollView и реализовать все методы, которые UIWebView реализует и имитирует это поведение, а затем проверить didScroll для этого условия.


Извините, я думал 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...
 }
 // }
}
</uiscrollviewdelegate>

licensed under cc by-sa 3.0 with attribution.