我有一个水平滚动的集合视图,并跨越其父视图的全宽。我在其上实现分页的便宜方法是将单元格宽度设置为等于集合视图宽度的1/3,并设置与左右内容插入相同的宽度。
我在IB中禁用滚动并用左右滑动识别器替换。我的代码几乎无法设置contentInset
,但设置contentInset
似乎可以防止任何滚动发生
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
CGFloat itemWidth = self.collectionView.bounds.size.width/3.0;
NSInteger count = [self collectionView:self.collectionView numberOfItemsInSection:0];
self.collectionView.contentSize = (CGSize){ .width=itemWidth*count, .height=self.collectionView.bounds.size.height };
// uncomment this line, and the scroll code in the swipes below fails to work
//self.collectionView.contentInset = UIEdgeInsetsMake(0, itemWidth, 0, itemWidth);
self.collectionView.contentOffset = (CGPoint){ .x=self.collectionView.contentSize.width/2.0, .y=0 };
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
CGFloat width = self.view.bounds.size.width/3.0;
return (CGSize){ .width=width, .height=collectionView.bounds.size.height };
}
此代码处理滑动...
- (NSIndexPath *)centerIndexPath {
CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};
CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));
return [self.collectionView indexPathForItemAtPoint:visiblePoint];
}
- (void)swipeLeft:(UISwipeGestureRecognizer *)gr {
NSIndexPath *centerIndexPath = [self centerIndexPath];
NSLog(@"at %@", centerIndexPath);
if (centerIndexPath.row < [self collectionView:self.collectionView numberOfItemsInSection:0]-1) {
[self.collectionView scrollToItemAtIndexPath:centerIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:YES];
}
}
- (void)swipeRight:(UISwipeGestureRecognizer *)gr {
NSIndexPath *centerIndexPath = [self centerIndexPath];
NSLog(@"at %@", centerIndexPath);
if (centerIndexPath.row > 0) {
[self.collectionView scrollToItemAtIndexPath:centerIndexPath atScrollPosition:UICollectionViewScrollPositionRight animated:YES];
}
}
所有这些都有效,除非我在上面的设置中设置了contentInsets。然后,即使我在调试器中到达scrollToItemAtIndexPath:代码,也不会发生滚动。
拥有这些插图非常重要,因为我希望用户了解中心项目是所选项目。
有人可以解释为什么contentInset会破坏滚动以及如何修复?
答案 0 :(得分:2)
看起来UICollectionView有自己的内置方法来处理insets:
使用Section Insets来调整内容的边距 截面插入是调整可用于布置单元格的空间的一种方法。您可以使用insets在节的标题视图之后和页脚视图之前插入空格。您还可以使用insets在内容的两侧插入空格。图3-5演示了insets如何影响垂直滚动流布局中的某些内容。
图3-5部分插入更改了布置单元格的可用空间