包含UIWebViews的“无限UIScrollView”

时间:2011-07-26 12:34:50

标签: iphone objective-c uiwebview uiscrollview infinite-scroll

背景:

首先,背景。我通过使用宽度为三页(0,1和2)的UIScrollView创建了一个“无限滚动视图”,然后确保在不滚动时UIScrollView始终位于第1页的中心。当您滚动到第0页或第2页并且UIScrollViewDelegate检测到滚动结束时,所有三个页面的内容首先按照您滚动的方向切换,然后UIScrollView立即返回到第1页,模拟效果您可以继续滚动浏览无穷无尽的页面。

起初,我使用UITextView来显示每个页面的文本内容,但很快就想要在文本样式方面更灵活。因此,我最终使用了一个UIWebView,我在其中加载了一个NSString,其中包含我希望显示的样式化HTML内容。这非常有效,就像我希望它看起来一样。

问题:

自然地,在UIWebView中加载,解析和显示简单的HTML页面比在UITextView中加载静态文本花费更长的时间。因此,当您向任何方向滚动并且滚动视图自动向后移动并切换页面内容时,您可以在新内容显示之前提示旧内容十分之一秒。

我的解决方案(不起作用):

我在文档中搜索了UIWebViewDelegate,发现当页面加载完毕时会发生一个事件。我把它搞定了:

  1. 用户从第1页滚动到第2页。
  2. UIScrollViewDelegate调用scrollViewDidEndDecelerating,告诉第1页将其内容切换为第2页当前显示的相同内容。
  3. 第1页的UIWebViewDelegate调用webViewDidFinishLoad,告诉UIScrollView返回第1页,然后切换第0页和第2页的内容。
  4. 在我的脑海中,这将解决这个问题,但显然它仍然不够。因此,我向你求助。有任何想法吗?可能值得一提的是,我已经在所有方法中使用了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];
        }
    

1 个答案:

答案 0 :(得分:1)

我认为你可以做的是

  1. 从一开始就用相关内容填充所有三个页面..(你可能已经这样做了)......
  2. 滚动开始时,滚动时会显示下一个(或上一个)页面。
  3. 滚动完成后,将滚动内容视图移动到中心,而不是更改每个Web视图中的文本,更改视图的帧,以便相关的Web视图(即一个用户已滚动到)保持不变在中心,其他两个都在两侧进行调整
  4. 更改两个网页视图的内容(不可见),以便为下一次滚动移动做好准备。
  5. 在快速滚动的情况下,这仍然会失败..但由于加载内容的滞后,任何方法都会在那里提交(我认为) 因此,您可以将所有Web视图设置为空白(不加载任何内容),并在快速滚动时显示活动指示符..