我正在尝试使用无限滚动行为实现集合视图。滚动应该是圆形的 - 就像在UIPickerView
中一样。是否可以使用Apple的UICollectionView
或者除了创建水平PickerView之外别无选择?
您怎么看?
答案 0 :(得分:2)
您应该观看WWDC 2011会话视频“高级ScrollView技术”,他们谈论无限滚动,我很确定可以将其与UICollectionView
一起使用。滚动时会重新显示,并将新项目放在当前可见项目之后(或之前,具体取决于滚动方向)。
就像他们在会话中所说的那样,你应该不使用具有结尾的方法。就像在会议中所说:人们肯定会在某一点找到优势。
答案 1 :(得分:0)
重写此方法以启用无限滚动。只要距离中心太远,它就会集中内容,用户永远不会达到目的。
-(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);
}
}
答案 2 :(得分:-1)
感谢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;
}
// DidSelect
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"Index path is %d", indexPath.row%self.dataArray.count);
}
这将产生无限滚动效果。 要启用无限滚动两边,请在ViewWillAppear中使用ScrolltoIndexpath :( Itemscount的中间)!! 希望这将有助于即将构建无限滚动UICollectionView的人。
答案 3 :(得分:-2)
是的,你可以这样做。为collectionView:numberOfItemsInSection:返回一个非常大的数字,并在collectionView:cellForItemAtIndexPath:中,使用mod运算符始终为indexPath.Row返回一个数字,该数字介于0和数据数组中的最后一个索引之间。因此,如果你的数组中有20个项目,你可以这样做:
item.whatever.text = [self.theData objectAtIndex:indexPath.row %20];