我正在创建一个启用了分页机制的简单UICollectionView
,一切正常。但是,当滚动到最后一页时,屏幕中的单元格数量不完全可见,最后一页包含上一页面的一些单元格。
如何展开contentSize
的{{1}},以便最后一页不包含上一页的任何单元格?
示例here:UICollectionView
水平滚动6个单元格,这样:
第1页:UICollectionView
滚动:cell2-cell3-cell4-cell5 //不期望:如何更改为:cell4 - 第2页中的单元格5。
概要
我想设置
cell0 - cell1 - cell2 - cell3
不
collectionView.contentSize = numberOfPage * collectionView.frame
答案 0 :(得分:35)
您需要继承UICollectionViewLayout
并覆盖collectionViewContentSize
方法。我将UICollectionViewFlowLayout
子类化,因此我不必重写所有布局代码。
我正在构建一个4x4网格,所以我的方法看起来像这样:
- (CGSize)collectionViewContentSize
{
NSInteger itemCount = [self.collectionView numberOfItemsInSection:0];
NSInteger pages = ceil(itemCount / 16.0);
return CGSizeMake(320 * pages, self.collectionView.frame.size.height);
}
旁注,当您使用自定义布局时,您将无法在Interface Builder中设置某些显示属性。您可以在自定义UICollectionViewLayout子类的init
方法中以编程方式设置它们。这是我的参考:
- (id)init
{
self = [super init];
if (self) {
[self setup];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
[self setup];
}
return self;
}
- (void)setup
{
self.itemSize = CGSizeMake(65.0f, 65.0f);
self.minimumLineSpacing = 15;
self.sectionInset = UIEdgeInsetsMake(7.5f, 7.5f, 30.0f, 7.5f);
[self setScrollDirection:UICollectionViewScrollDirectionHorizontal];
}
答案 1 :(得分:2)
用于水平分页
if(CollectionView.pagingEnabled)
{
int numberOfPages = floor(collectionView.contentSize.width /
collectionView.frame.size.width) + 1;
CGFloat
float requierdWidth=self.collectionView.frame.size.width*numberOfPages;
self.Layout.footerReferenceSize=CGSizeMake(requierdWidth-self.collectionView.contentSize.width,0);
}
答案 2 :(得分:1)
答案很有效,但对于我们的代码,我们每页有一个部分。所以这意味着我们的布局类的覆盖只是
-(CGSize) collectionViewContentSize {
return CGSizeMake(CGRectGetWidth(self.collectionView.frame) *
[self.collectionView numberOfSections],
CGRectGetHeight(self.collectionView.frame)) ;
}
答案 3 :(得分:0)
您可以使用viewDidLayoutSubviews:
方法调整内容。当集合视图和所有单元格放在view
中时,将调用此方法,以便您可以调整单元格。
答案 4 :(得分:0)
我认为你必须继承UICollectionViewLayout
并创建自定义布局来管理这类问题。
答案 5 :(得分:0)
我有一个不需要任何子类化的答案。
在-viewDidLoad中,计算每页有多少项目以及您将拥有多少页面。将这些值存储在属性中。
self.numberOfItemsPerPage = NumberOfRows * NumberOfColumns;
self.numberOfPages = ceilf((CGFloat)self.items.count / (CGFloat)self.numberOfItemsPerPage);
然后在-collectionView:numberOfItemsInSection:只是撒谎:
return self.numberOfItemsPerPage * self.numberOfPages;
你当然会有比内容更多的细胞,对吧?所以in -collectionView:cellForItemAtIndexPath:只为额外的单元格返回nil:
if (indexPath.item > [self.items count] - 1) {
//We have no more items, so return nil. This is to trick it to display actual full pages.
return nil;
}
你去:完整,可滚动的最后一页。在我看来,水平滚动模式应该默认为这个。