如何在 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 框架