的背景:
首先,背景。我通过使用宽度为三页(0、1 和 2)的 UIScrollView 创建了一个“无限滚动视图”,然后确保 UIScrollView 在不滚动时始终位于第 1 页的中心。当您滚动到第 0 页或第 2 页并且 UIScrollViewDelegate 感应到滚动结束时,所有三个页面的内容首先切换到您滚动的方向,然后 UIScrollView 立即移回第 1 页,模拟效果您可以继续滚动浏览无穷无尽的页面。
起初,我使用 UITextView 来显示每个页面的文本内容,但很快就想要更灵活地设置文本样式。因此,我最终使用了一个 UIWebView,我在其中加载了一个 NSString,其中包含我希望显示的样式化 HTML 内容。这很完美,就像我想要的那样。
问题:
自然地,在 UIWebView 中加载、解析和显示一个简单的 HTML 页面比在 UITextView 中加载静态文本需要更长的时间。因此,当您向任何方向滚动时,滚动视图会自动向后移动并切换页面的内容,您可以在新内容显示之前提示旧内容十分之一秒。
我的解决方案(不起作用):
我在文档中搜索了 UIWebViewDelegate ,发现页面加载完成时有一个事件。我把它连接起来这样做:
- 用户从第 1 页滚动到第 2 页。
- UIScrollViewDelegate 调用 scrollViewDidEndDecelerating,告诉第 1 页将其内容切换到当前在第 2 页显示的相同内容。
- 第1页的UIWebViewDelegate调用webViewDidFinishLoad,告诉UIScrollView回到第1页,然后切换第0页和第2页的内容。
在我看来,这可以解决这个问题,但显然还不够。因此,我请你帮忙。有任何想法吗?可能值得一提的是,我在所有方法中都有 NSLog 并确保它们被调用。如果还有什么问题,我很乐意回答您的任何问题。
提前致谢!
包含 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];
}
子视图的视图控制器在 UIScrollView 中显示为单独的页面
// The delegate shown in previous code
- (void)webViewDidFinishLoad:(UIWebView *)webView {
[[self delegate] webViewFinishedLoading];
}