ScrollOffset в UIWebView? - PullRequest
       37

ScrollOffset в UIWebView?

9 голосов
/ 22 октября 2009

Мне очень трудно понять делегатов и наследование объектов (если я могу использовать это слово), и я думаю, что мне нужна простая (или я так думаю) вещь: перехватить событие scrollViewDidScroll в UIWebView и получить смещение (в основном, просто чтобы узнать, не находится ли прокрутка сверху / снизу, чтобы я мог скрыть панели навигации и вкладки).

Есть ли способ, которым я мог бы это сделать? Я уже использую UIWebviewDelegate в моем контроллере представления для "shouldStartLoadWithRequest". Может быть, я мог бы как-то использовать UIScrollViewDelegate для scrollViewDidScroll? Если да, то как?

У меня действительно проблемы с пониманием делегатов. Я перечитал некоторые статьи, но на практике мне не удается их использовать.

Любая помощь или информация была бы прекрасна.

Заранее спасибо!

Ответы [ 7 ]

13 голосов
/ 03 ноября 2010

Чтобы получить события прокрутки в UIWebView, я лично использую этот код, чтобы получить представление прокрутки, которое находится внутри UIWebView:

- (void) addScrollViewListener
{
    UIScrollView* currentScrollView;
    for (UIView* subView in self.myWebView.subviews) {
        if ([subView isKindOfClass:[UIScrollView class]]) {
            currentScrollView = (UIScrollView*)subView;
            currentScrollView.delegate = self;
        }
    }
}

Это работает. Вы также можете использовать его для вызова [currentScrollView setContentOffset:offSet animated:YES]; Единственной проблемой может быть не пройти проверку кода Apple. Я еще не знаю, так как я все еще на этапе кодирования.

[ОБНОВЛЕНИЕ] Приложение с этим кодом находится в магазине приложений уже 4 месяца и используется 40 000 пользователей. У меня не было никаких проблем [ОБНОВЛЕНИЕ]

7 голосов
/ 02 июня 2010

Вы можете использовать следующие методы для решения вашей проблемы.

Для получения страницы Offset:

int pageYOffset = [[webViewObj stringByEvaluatingJavaScriptFromString: @ "window.pageYOffset"] intValue];

Для получения общей высоты прокрутки веб-страницы:

int scrollHeight = [[webViewObj stringByEvaluatingJavaScriptFromString: @ "document.documentElement.scrollHeight"] intValue];

Для прокрутки веб-страницы до определенного смещения:

[webViewObj stringByEvaluatingJavaScriptFromString: [NSString stringWithFormat: @ "document.body.scrollTop =% d", scrollHeight]];

4 голосов
/ 14 ноября 2012

Старая ветка, я знаю -

Начиная с iOS 5.0 вы можете использовать

myAccountWebView.scrollview

для доступа к размеру и смещению контента.

4 голосов
/ 17 ноября 2010

Я сделал модификацию для определения класса с помощью isKindOfClass. Работает, но могут возникнуть проблемы с проверкой кода Apple, как указано выше.

UIScrollView* currentScrollView;
for (UIView* subView in terms.subviews) {
    if ([subView isKindOfClass:[UIScrollView class]]) {
        NSLog(@"found scroll view");
        currentScrollView = (UIScrollView *)subView;
        currentScrollView.delegate = self;
    }
}
2 голосов
/ 22 октября 2009

Существует представление прокрутки в UIWebView, но оно a) не является UIScrollView, а b) Apple рассматривает детали частной реализации (и вы тоже должны). У меня только два предложения:

  1. Отправьте в Apple сообщение об ошибке с просьбой предоставить больше инфраструктуры веб-представления или, по крайней мере, добавить еще несколько методов делегирования, с помощью которых мы можем получать уведомления о подобных событиях.
  2. Добавьте на страницу код JavaScript, который прослушивает события прокрутки и уведомляет о них ваше приложение.

Основой # 2 является загрузка поддельного URL и загрузка вашего процесса делегирования веб-представления (и прервать!). (Этот вопрос несколько раз поднимался здесь, на переполнении стека.)

UPDATE:

Начиная с iOS 5, теперь в UIWebView есть свойство public scrollView, которое можно использовать для настройки поведения прокрутки. Точная иерархия представления веб-представления остается недокументированной деталью реализации, но это дает вам санкционированный способ доступа к этому фрагменту.

1 голос
/ 23 июня 2011

Я устал от метода делегата и обнаружил, что он не позволяет прокручивать представление при отображении клавиатуры. Я обнаружил, что, добавив наблюдателя, вы не переопределяете текущий делегат и не сможете повлиять на производительность веб-просмотра.

for (UIView* subView in myAccountWebView.subviews) {
    if ([subView isKindOfClass:[UIScrollView class]]) 
    {
        NSLog(@"found scroll view");
        [((UIScrollView*)subView) addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
    }
}
1 голос
/ 22 октября 2009

Хороший вопрос. UIWebView не является подклассом UIScrollView, хотя я понимаю, почему можно так подумать. Это означает, что использование методов UIScrollViewDelegate не позволяет делать то, что вы хотите, и протокол UIWebViewDelegate не отвечает на эти типы событий прокрутки сообщений. Я не думаю, что есть простой способ обнаружить прокручивающиеся события в веб-представлении.

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