【问题标题】:Objective-C : Endless UIScrollView without pagingEnabledObjective-C:没有 pagingEnabled 的无尽 UIScrollView
【发布时间】:2010-04-29 08:30:11
【问题描述】:

在我的 iPhone 应用程序中有一个滚动视图 pagingEnabled=NO,它可以包含多达 200 个子视图 (150 x 150),挑战是延迟加载和模拟水平方向的无限滚动(不反弹)。

对于这个请求是否有解决方案或替代方案?

【问题讨论】:

    标签: objective-c uiscrollview lazy-loading paging


    【解决方案1】:

    在 Apple 的示例代码项目之一中演示了滚动视图的延迟加载:PageControl

    为了伪造无休止的滚动,我的建议是让您的滚动视图一开始就非常宽,比普通人在一组滚动行为中滚动时要宽。然后在您的委托方法-scrollViewDidEndScrollingAnimation:-scrollViewDidEndDragging:willDecelerate:-scrollViewDidEndDecelerating: 中,其中一个或多个将在用户完成滚动后调用,重新定位您的内容以存在于滚动视图的中心并更新您的contentOffset没有动画的点。

    为了让其在视觉上工作,您还需要禁用水平滚动条。您还需要考虑如何使用此方法确定在特定contentOffset 处绘制什么视图,因为您将无法再将contentOffset.x 除以滚动视图的边界来找出您所在的位置。

    【讨论】:

      【解决方案2】:

      您好,我找到了方法。 我有一个包含所有子视图的主数组(在我的情况下它们是图像,所以我存储名称)。 滚动视图只有 3 个子视图:左、当前、右。 分页已启用,因此用户在任何时候都无法真正向左/向右旋转一个视图。 我要做的是: 1)跟踪他在主阵列上的当前位置。如果他向左移动,则减一;右加一个。像这样:

      - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
        [some code to determine current page, based on contentOffset]
          if (page == 0){
              NSLog(@"Going left");
              if (currentPage > 0){
                  currentPage--;
              } else {
                  //cycle to last
                  currentPage = [images count] -1;
              }
          } else if (page == 2){
              NSLog(@"Going right");
              if (currentPage < ([images count] -1)){
                  currentPage++;
              } else {
                  //cycle to first
                  currentPage = 0;
              }
          } else{
              NSLog(@"Not moving");
          }
      

      2) 用户移动后,我重新加载 3 张新图像,如下所示:

      //updates the 3 views of the scrollview with a new center page.
      -(void) updateScrollViewForIndex:(NSInteger)newCenterPage{
          //fist clean scroll view
          for (UIView *sView in [scroll subviews]){
              [sView removeFromSuperview];
          }
      
          NSInteger imgCount = [images count];
      
          //set center view
          [self loadImageIndex:newCenterPage atPosition:1];
      
          //set left view
          if (newCenterPage > 0){
              [self loadImageIndex:newCenterPage-1 atPosition:0];
      
          } else {
              //its the first image, so the left one is the last one
              [self loadImageIndex:imgCount-1 atPosition:0];
          }
      
          //set right view
          if (newCenterPage < imgCount-1){
              [self loadImageIndex:newCenterPage+1 atPosition:2];
          } else {
              //its the last image, so ther right one is the first one
              [self loadImageIndex:0 atPosition:2];       
          }
      }
      

      3) 最后再次将滚动视图重新居中到中心视图:

      [scroll setContentOffset:CGPointMake(1 * viewWidth, 0)];
      

      希望这会有所帮助,尽管“有计划的人”是指路的克拉克先生。

      贡索

      【讨论】:

        【解决方案3】:

        Matt Gallagher 有一个blog post,它描述了这个确切问题的解决方案。我用过,效果很好。

        Cocoa Touch 中的 UIScrollView 和 UIPageControl 允许具有多个平移页面的用户界面。 Apple 提供的示例项目 (PageControl) 将每个页面的所有子视图保存在延迟加载的数组中。我将向您展示如何仅使用两个子视图来实现这一点,无论您希望代表多少个虚拟页面。

        它通过在子视图周围随机播放并在必要时重置其内容来工作。我用它来显示闪存卡,其中可能有 3 到 3,000 个项目。虽然它现在是为分页设置的,但我相信你可以让它与常规滚动一起工作。

        【讨论】:

        猜你喜欢
        • 2012-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        • 2010-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多