Фон:
Прежде всего, фон.Я создал «бесконечное представление прокрутки» с помощью UIScrollView шириной в три страницы (0, 1 и 2), а затем убедился, что UIScrollView всегда центрируется на странице 1, когда не прокручивается.Когда вы прокручиваете страницу 0 или страницу 2, и UIScrollViewDelegate обнаруживает, что прокрутка завершена, содержимое всех трех страниц сначала переключается в направлении, которое вы прокрутили, а затем UIScrollView мгновенно возвращается на страницу 1, имитируя эффектчто вы можете продолжать прокручивать бесконечный поток страниц.
Сначала я использовал UITextView для отображения текстового содержимого каждой страницы, но довольно скоро захотелось сделать что-то более гибкое, когда дело касается стилизации текста.Поэтому я в конечном итоге использовал UIWebView, в котором я загружаю строку NSString, содержащую стилизованный контент HTML, который я хочу отобразить.Это сработало идеально, именно так, как я хотел, чтобы это выглядело.
Проблема:
Естественно, загрузка, анализ и отображение простой HTML-страницы занимает больше временив UIWebView, чем требуется, чтобы просто загрузить статический текст в UITextView.Из-за этого, когда вы прокручивали в любом направлении, и представление прокрутки автоматически перемещается назад и переключает содержимое страниц, вы можете намековать старый контент за одну десятую секунды до того, как отобразится новый.
Мое решение (которое не сработало):
Я искал UIWebViewDelegate в документации и обнаружил, что при загрузке страницы происходит событие.Я подключил это, чтобы сделать это:
- Пользователь прокручивает страницу от страницы 1 до страницы 2.
- UIScrollViewDelegate вызывает scrollViewDidEndDecelerating, сообщая странице 1, что она переключается на то же содержимое, которое отображается в данный момент.на странице 2.
- 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];
}