Вопрос по ios – UIWebView делегирует событие вертикальной прокрутки к родителю, если прокрутить вверх или вниз

4

У меня есть UIWebView в UIScrollView, который разбит на страницы. По сути, я хочу переключаться между различными видами веб-страниц с помощью жестов прокрутки / переключения. По горизонтали работает нормально. Если веб-просмотр прокручивается до «границы страницы», событие прокрутки / панорамирования передается в просмотр прокрутки, так что отображается следующая страница. На вертикальной оси это не работает. Похоже, событие прокрутки не передается. Это может быть проблема с подпрыгиванием, которое я отключил, потому что я думал, что оно поглотит событие. Но даже при отключенном подпрыгивании это не работает.

Я проверял это раньше с TextViews в scrollview, который тоже работал. Может быть особенное поведение веб-просмотров.

Есть идеи, как мне заставить это работать? Нужно ли реализовывать прослушиватели событий и передавать события вручную в представление прокрутки?

Кроме того, если у вас есть идея, как реализовать этот вид макета, дайте мне знать. Как я уже сказал, я хочу иметь сетку различных представлений, которые можно изменить с помощью жестов прокрутки / прокрутки. Подобно приложению AppStore, в котором сведения о приложении можно прокручивать по вертикали, а скриншоты - по горизонтали.

ура Хенрик

Ваш Ответ

3   ответа
2

Я делал это раньше, но я прекратил использовать Javascript и Obj-c. Я добавил функцию, которая проверяет (с помощью JQuery), находится ли страница внизу или вверху прокрутки (мне это нужно для моего приложения). Затем я вызываю эту функцию с помощью NSTimer, используя:

NSString *str= [webView stringByEvaluatingJavaScriptFromString:@"JSFunction()"];

Я знаю, что это некрасиво, но это был единственный способ сделать это в то время, и он просто делал свою работу. Вот код, который я использовал:

function JSFunction() {
    var docHeight = $(document).height();
    var scroll    = $(window).height() + $(window).scrollTop();
    if (docHeight == scroll || $(window).scrollTop() < 10)
                 return "TOP";
            else
                 return "BODY";
}
Может быть, вы можете изменить это, чтобы действовать по событиям, делая так, чтобы Javascript сообщал, что пользователь прокручивал внизу страницы.
У меня есть некоторый код, чтобы проверить, прокручивается ли веб-просмотр вверх или вниз, поэтому нет необходимости в javascript. Но, если это так, как я могу делегировать события прокрутки родительскому представлению прокрутки? henrik
9

Итак, я понял это.

Сначала я устанавливаю делегата веб-просмотра, чтобы получить события прокрутки и проверить, прокручивается ли веб-просмотр сверху или снизу:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if([scrollView isEqual:webView.scrollView]) {
        float contentHeight = scrollView.contentSize.height;
        float height = scrollView.frame.size.height;
        float offset = scrollView.contentOffset.y;

        if(offset == 0) {
            webViewScrolledToTop = true;
            webViewScrolledToBottom = false;
        } else if(height + offset == contentHeight) {
            webViewScrolledToTop = false;
            webViewScrolledToBottom = true;
        } else {
            webViewScrolledToTop = false;
            webViewScrolledToBottom = false;
        }

        //NSLog(@"Webview is at top: %i or at bottom: %i", webViewScrolledToTop, webViewScrolledToBottom);
    }
}

Затем я зарегистрировал дополнительные средства распознавания жестов смахивания в просмотре прокрутки в веб-представлении:

swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeUp)];
swipeUp.direction = UISwipeGestureRecognizerDirectionUp;
swipeUp.delegate = self;
[self.webView.scrollView addGestureRecognizer:swipeUp];
[self.webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeUp];
swipeDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeDown)];
swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
swipeDown.delegate = self;
[self.webView.scrollView addGestureRecognizer:swipeDown];
[self.webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeDown];

Обратите внимание на звонки[self.webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeUp];, Это абсолютно необходимо, поскольку без них распознаватель жестов панорамирования веб-просмотра всегда будет использовать события, прежде чем они достигнут распознавателя жестов смахивания. Эти звонки меняют приоритеты.

В методах swipeUp и swipeDown я вычисляю положение следующей & quot; страницы & quot; и прокрутите родительский вид прокрутки до этой позиции, если на самом деле есть следующая страница.

И последнее, что нужно проверить, прокручивается ли веб-просмотр сверху или снизу и принимает ли жесты только в этом случае. Для этого вам необходимо реализовать делегат распознавателя жестов:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if(gestureRecognizer == swipeUp) {
        return webViewScrolledToBottom;
    } else if(gestureRecognizer == swipeDown) {
        return webViewScrolledToTop;
    }

    return false;
}

Возможно, вам также придется отключить отскок прокрутки, чтобы заставить эту работу работать с веб-страницами, которые настолько малы, что они вообще не прокручиваются:webView.scrollView.bounces = false;

4

Это действительно прокрутка, которая прокручивается по вертикали, или это веб-просмотр? Я не пробовал сам, но, возможно, это поможет ...

webView.scrollView.scrollEnabled = NO; 
webView.scrollView.bounces = NO;

или же ...

webView.userInteractionEnabled = NO;
Мне сложно описать это. Это WebView, который прокручивается в первую очередь. Теперь, для горизонтальной прокрутки, поведение таково, что событие прокрутки передается в родительское представление прокрутки, если веб-просмотр достиг стороны документа. В этом случае открывается следующее веб-представление. Мне нужно то же поведение на вертикальной оси, но в данный момент веб-просмотр прокручивается вверх (или вниз), и тогда больше ничего не происходит. Отключение прокрутки / взаимодействия с пользователем в веб-просмотре не вариант для меня, потому что я все еще хочу, чтобы пользователь мог масштабировать и прокручивать веб-просмотр. henrik

Похожие вопросы