【问题标题】:UICollectionView with infinite scrolling?UICollectionView 无限滚动?
【发布时间】:2013-03-09 21:55:18
【问题描述】:

我正在尝试实现具有无限滚动行为的集合视图。滚动应该是圆形的 - 就像在 UIPickerView 中一样。是不是可以用苹果的UICollectionView 来完成,还是别无选择,只能创建一个水平的 PickerView ?

你怎么看?

【问题讨论】:

  • 你的意思是无限重新显示固定数量的元素吗?
  • 即使可以,也不应该。 UICollectionView 不是为这种行为而设计的,即使您可以解决问题,它的表现也会很差。
  • @Eric:是的。就像一个 UIPickerView
  • @DBD,性能会很差是不正确的。由于单元格重用,您拥有多少明显的行并不重要。单元格的数量永远不会超过一次在屏幕上可以看到的数量。
  • @DBD 错了,看看日历应用

标签: ios uiscrollview uipickerview uicollectionview


【解决方案1】:

是的,您可以这样做。为 collectionView:numberOfItemsInSection: 返回一个非常大的数字,在 collectionView:cellForItemAtIndexPath: 中,您使用 mod 运算符始终为 indexPath.Row 返回一个介于 0 和数据数组中最后一个索引之间的数字。因此,如果您的数组中有 20 个项目,您将执行以下操作:

item.whatever.text = [self.theData objectAtIndex:indexPath.row %20];

【讨论】:

  • 如果我们到达最后一个单元格会发生什么?
  • @Alex1987,它会结束,但如果你将数字设置得足够高,就很难滚动那么远。在用户看来,它是无限的。选择器视图的工作方式相同,它们并不是真正的循环。
  • @rdelmar 这是一个错误的假设!实际上,您确实必须欺骗用户,因为它实际上从来都不是真正的无限滚动。但是有更好的方法来实现它。如果需要,只需将项目添加到结尾/开头,这样就没有结尾了。这似乎比您的解决方案“更无限”。
  • @rdelmar 实现 WWDC 会议上的内容并不难。如果你不知道如何正确地做某事,你只是选择了错误的方法,而不是学习如何以正确的方式去做?是的,我确实对你的回答投了反对票。我这样做的时候是 +1,所以显然我不是唯一的......
  • @GuidoH,你说得对,它没那么难——我过去曾尝试过类似的方法,但在 scrollViewDidScroll 中进行了偏移调整,这导致了非常生涩的结果,所以我认为它需要相当多的代码才能使它正确。实际上,使用集合视图比他们在视频中所做的要容易得多,因为集合视图已经处理了他们掩盖的所有平铺内容。感谢您的提醒,我看过很多这几年的视频,但我错过了那个。
【解决方案2】:

您应该观看 WWDC 2011 会议视频“高级 ScrollView 技术”,他们谈论无限滚动,我很确定可以将其与 UICollectionViews 一起使用。它会在您滚动时居中,并将新项目放置在当前可见项目之后(或之前,具体取决于滚动方向)。

就像他们在会议中所说的那样,您应该使用有结局的方法。正如会议中所说:人们肯定会在某一时刻找到优势。

【讨论】:

    【解决方案3】:

    感谢 rdelmar 提供了一个棘手的解决方案。 “collectionView:numberOfItemsInSection 的大量数字”的想法就像一个魅力。我试图用 UIScrollView 委托方法实现相同的功能。但输出很生涩。

    这是我的代码的一部分。

    -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    
    return 100;}
    

    // CellforRow

    -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    
    // Setup cell identifier
    static NSString *cellIdentifier = @"cvCell";
    
    
    CVCell *cell;
            cell = (CVCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
    
            [cell.titleLabel setText:[self.dataArray objectAtIndex:(indexPath.row)%self.dataArray.count]];
    
    return cell;
    

    }

    // 没有选择

    -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
    
    
    NSLog(@"Index path is %d", indexPath.row%self.dataArray.count);
    

    }

    这将产生无限滚动效果。 要启用两侧无限滚动,请在 ViewWillAppear 中使用 ScrolltoIndexpath:(middle of Itemscount) ! 希望这将帮助即将构建无限滚动 UICollectionView 的人。

    【讨论】:

      【解决方案4】:

      重写此方法以启用双向无限滚动。每当它离中心太远时,它都会使内容居中,并且用户永远不会到达终点。

      -(void)scrollViewDidScroll:(UIScrollView *)scrollView {
      CGPoint currentOffset = self.collectionView.contentOffset;
      CGFloat contentWidth = self.collectionView.contentSize.width;
      CGFloat centerOffsetX = (contentWidth - self.collectionView.bounds.size.width) / 2.0;
      CGFloat distanceFromCenter = fabs(currentOffset.x - centerOffsetX);
      
      if (distanceFromCenter > (contentWidth / 4.0)) {
          self.collectionView.contentOffset = CGPointMake(centerOffsetX, currentOffset.y);
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2016-03-27
        • 1970-01-01
        • 2014-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2015-05-31
        相关资源
        最近更新 更多