背景:
首先,背景。我通过使用宽度为三页(0,1和2)的UIScrollView创建了一个“无限滚动视图”,然后确保在不滚动时UIScrollView始终位于第1页的中心。当您滚动到第0页或第2页并且UIScrollViewDelegate检测到滚动结束时,所有三个页面的内容首先按照您滚动的方向切换,然后UIScrollView立即返回到第1页,模拟效果您可以继续滚动浏览无穷无尽的页面。
起初,我使用UITextView来显示每个页面的文本内容,但很快就想要在文本样式方面更灵活。因此,我最终使用了一个UIWebView,我在其中加载了一个NSString,其中包含我希望显示的样式化HTML内容。这非常有效,就像我希望它看起来一样。
问题:
自然地,在UIWebView中加载,解析和显示简单的HTML页面比在UITextView中加载静态文本花费更长的时间。因此,当您向任何方向滚动并且滚动视图自动向后移动并切换页面内容时,您可以在新内容显示之前提示旧内容十分之一秒。
我的解决方案(不起作用):
我在文档中搜索了UIWebViewDelegate,发现当页面加载完毕时会发生一个事件。我把它搞定了:
在我的脑海中,这将解决这个问题,但显然它仍然不够。因此,我向你求助。有任何想法吗?可能值得一提的是,我已经在所有方法中使用了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];
}
答案 0 :(得分:1)
我认为你可以做的是
在快速滚动的情况下,这仍然会失败..但由于加载内容的滞后,任何方法都会在那里提交(我认为) 因此,您可以将所有Web视图设置为空白(不加载任何内容),并在快速滚动时显示活动指示符..