如何在 iOS Objective-c 的 UICollectionView 中创建无限滚动

Posted

技术标签:

【中文标题】如何在 iOS Objective-c 的 UICollectionView 中创建无限滚动【英文标题】:How can I create Infinite Scrolling in UICollectionView for iOS Objective-c 【发布时间】:2018-01-03 11:25:56 【问题描述】:

如何在我的UICollectionView 中创建无限滚动?

附上截图:

现在我的NSArray

NSArray* nameArr = [NSArray arrayWithObjects: @"0", @"1", @"2", @"3", @"4", nil];

我想在collectionView中创建一个Infinite Scrolling After Complete数组一次又一次地重复所有单元格。

无限滚动需要左右两边。

如果是,那么我该如何实现,请在objective-c中给出参考。

谢谢!!!提前

【问题讨论】:

你可以用 UIPageViewController 实现它,但我不认为你可以用 UICollectionViewController 实现它 @SandeepBhandari 请提供指导或参考我该怎么做?如果您对无限滚动有更多想法,请告诉我。 但是现在我需要用 UICollectionView 来实现。 让我们continue this discussion in chat. uicollectionview infinite scrolling 的简单谷歌搜索显示了许多结果,包括操作方法、教程、示例等...... 【参考方案1】:

首先用 NSMutableArray 替换您当前的 NSArray 并在您的 cellForItemAtIndexPath 中进行上述更改

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
    return nameArr.count;


- (__kindof UICollectionViewCell *) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 

     UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];

     UILabel *label = [cell viewWithTag:25];
     [label setText:[NSString stringWithFormat:@"%ld",(long)indexPath.row]];

     if(indexPath.row == nameArr.count-1) 
        [nameArr addObjectsFromArray:nameArr.mutableCopy];
        [collectionView reloadData];
     
     return cell;

在这里,我们一次又一次地添加相同的数组对象,因此它将无限滚动。 附截图:Refer This

希望对你有帮助

【讨论】:

感谢您的回答。但它只用于从右到左无限滚动,而不是从左到右滚动。 我喜欢目标c中的这种无限滚动。 cocoacontrols.com/controls/hfswipeview【参考方案2】:

简单的方法是使用StableCollectionViewLayout。

实现的基本原理是创建 UICollectionViewLayout 的子类并覆盖这些方法

override open func prepare(forCollectionViewUpdates updateItems: [UICollectionViewUpdateItem]) 
    super.prepare(forCollectionViewUpdates: updateItems)

    // there is possible to calculate a content offset the difference
    // with the help layout attributes for each updated item or only visible items
    self.offset = calculate(...)


override open func finalizeCollectionViewUpdates() 
    super.finalizeCollectionViewUpdates()
    self.offset = nil


override open func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint) -> CGPoint 
    // there is necessary to add difference to/instead proposedContentOffset
    if let offset = self.offset 
       return offset
    
    return proposedContentOffset

它允许在插入或删除发生时保持内容偏移。 然后你可以在头部插入并删除尾部,反之亦然。

【讨论】:

【参考方案3】:

遇到了同样的问题,我通过返回项目数解决了它 在 numberOfItemsInSection 中:2

-(NSInteger)collectionView:(UICollectionView *)collectionView 
numberOfItemsInSection:(NSInteger)section
    return _array.count * 2;

在 cellForItemAtIndexPath 中,我以通常的方式返回单元格,如果索引高于 _array.count,则只需从索引中减去 _array.count。

-(UICollectionViewCell *)collectionView:(UICollectionView 
*)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    NSInteger index = indexPath.item;
    if(index > _array.count - 1)
        index -= _array.count;
    
    CellView *cell = [collectionView 
        dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" 
        forIndexPath:indexPath];
    //To get the string from the array use
    NSString string = [_array objectAtIndex:(index % _array.count)];
    return cell;

现在这个方法的问题是我在 collectionView 中只使用了 2N 个项目,而不是一个巨大的随机数。

诀窍是“将 2 个数组并排放置”并使用偏移量将用户保持在中间。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
    int scrollViewWidth = scrollView.contentSize.width;

    CGPoint offset = scrollView.contentOffset;
    if(offset.x < scrollViewWidth /4)
        offset.x += scrollViewWidth / 2;
        [scrollView setContentOffset:offset];
     else if(offset.x > scrollViewWidth /4 *3)
        offset.x -= scrollViewWidth / 2;
        [scrollView setContentOffset:offset];
    
 

【讨论】:

以上是关于如何在 iOS Objective-c 的 UICollectionView 中创建无限滚动的主要内容,如果未能解决你的问题,请参考以下文章

如何从Javascript调用Objective-C方法并将数据发送回iOS中的Javascript?

如何通过NEHotspotHelper获取WiFi列表(IOS,objective-c)

如何在 Flutter 插件的 Swift 编写的 iOS 部分中使用 Objective-C 框架

如何在 iOS 二进制文件中打印所有 Objective-C 类的名称?

如何在 Objective-C iOS 中解析 JSON

如何在 iOS 的 Objective-C 中使用对齐区域编程拖放