«Бесконечный UIScrollView», содержащий UIWebViews - PullRequest
0 голосов
/ 26 июля 2011

Фон:

Прежде всего, фон.Я создал «бесконечное представление прокрутки» с помощью UIScrollView шириной в три страницы (0, 1 и 2), а затем убедился, что UIScrollView всегда центрируется на странице 1, когда не прокручивается.Когда вы прокручиваете страницу 0 или страницу 2, и UIScrollViewDelegate обнаруживает, что прокрутка завершена, содержимое всех трех страниц сначала переключается в направлении, которое вы прокрутили, а затем UIScrollView мгновенно возвращается на страницу 1, имитируя эффектчто вы можете продолжать прокручивать бесконечный поток страниц.

Сначала я использовал UITextView для отображения текстового содержимого каждой страницы, но довольно скоро захотелось сделать что-то более гибкое, когда дело касается стилизации текста.Поэтому я в конечном итоге использовал UIWebView, в котором я загружаю строку NSString, содержащую стилизованный контент HTML, который я хочу отобразить.Это сработало идеально, именно так, как я хотел, чтобы это выглядело.

Проблема:

Естественно, загрузка, анализ и отображение простой HTML-страницы занимает больше временив UIWebView, чем требуется, чтобы просто загрузить статический текст в UITextView.Из-за этого, когда вы прокручивали в любом направлении, и представление прокрутки автоматически перемещается назад и переключает содержимое страниц, вы можете намековать старый контент за одну десятую секунды до того, как отобразится новый.

Мое решение (которое не сработало):

Я искал UIWebViewDelegate в документации и обнаружил, что при загрузке страницы происходит событие.Я подключил это, чтобы сделать это:

  1. Пользователь прокручивает страницу от страницы 1 до страницы 2.
  2. UIScrollViewDelegate вызывает scrollViewDidEndDecelerating, сообщая странице 1, что она переключается на то же содержимое, которое отображается в данный момент.на странице 2.
  3. UIWebViewDelegate на странице 1 вызывает webViewDidFinishLoad, сообщая UIScrollView вернуться на страницу 1 и затем переключать содержимое страниц 0 и 2.

В моей голове этобы решить эту проблему, но, видимо, этого все еще недостаточно.Поэтому я прошу вас о помощи.Есть идеи?Стоит упомянуть, что у меня есть NSLog во всех методах и я уверен, что они вызываются.Если есть что-то еще, я был бы рад ответить на любые ваши вопросы.

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

View Controller, содержащий UIScrollView:

    // Sense when the UIScrollView stops accelerating
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)sender {
        if(pScrollView.contentOffset.x > pScrollView.frame.size.width) {
            [self switchToNextPost];
        } else if (pScrollView.contentOffset.x < pScrollView.frame.size.width) {
            [self switchToPreviousPost];
        }
    }

    // Update the currentPost variable and switch page 1
    - (void)switchToNextPost {
        [prefs setInteger:[[self getNextKey:nil] intValue] forKey:@"currentPost"];

        [self loadPostWithKey:[self getCurrentKey] atPage:[NSNumber numberWithInt:1] withViewController:currentPage];
    }

    // Update the currentPost variable and switch page 1
    - (void)switchToPreviousPost {
        [prefs setInteger:[[self getPreviousKey:nil] intValue] forKey:@"currentPost"];

        [self loadPostWithKey:[self getCurrentKey] atPage:[NSNumber numberWithInt:1] withViewController:currentPage];
    }

    // Custom delegate function. Scrolls UIScrollView to page 1 and then loads new content on page 1 and 3
    - (void)webViewFinishedLoading {
        [pScrollView scrollRectToVisible:CGRectMake(pScrollView.frame.size.width, 0, pScrollView.frame.size.width, pScrollView.frame.size.height) animated:NO];

        [self loadPostWithKey:[self getPreviousKey:nil] atPage:[NSNumber numberWithInt:0] withViewController:previousPage];
        [self loadPostWithKey:[self getNextKey:nil] atPage:[NSNumber numberWithInt:2] withViewController:nextPage];
    }

View Controller для подпредставлений, отображаемых как отдельные страницы в UIScrollView

    // The delegate shown in previous code
    - (void)webViewDidFinishLoad:(UIWebView *)webView {
        [[self delegate] webViewFinishedLoading];
    }

1 Ответ

1 голос
/ 26 июля 2011

что вы можете сделать, я думаю, это

  1. заполнить все три страницы релевантным контентом с самого начала .. (вы, вероятно, уже делаете это) ...
  2. при запуске прокрутки следующая (или предыдущая) страница отображается при прокрутке ..
  3. по окончании прокрутки переместите представление содержимого прокрутки в центр, как вы уже делаете, и вместо изменения текста в каждом веб-представлении измените фреймы представлений так, чтобы оставалось релевантным веб-представление (т. Е. Один пользователь прокрутил до). в центре, а два других настроены с обеих сторон
  4. изменить содержимое обоих веб-представлений (которые не отображаются), чтобы они были готовы к следующему движению прокрутки ..

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

...