如何实现分页时扩大UICollectionView contentSize?(How to expa

2019-07-19 19:41发布

我做一个简单的UICollectionView用分页机制启用,一切工作正常。 不过,当滚动到最后一页的细胞的数量并不完全可见的屏幕,并在最后一页包含前一页的一些细胞。

如何扩大contentSize的的UICollectionView使最后一页不包含前一页的任何细胞?

一个例子在这里 :在UICollectionView 6个细胞,这样水平滚动:

第1页: cell0 - cell1 - cell2 - cell3

滚动:小区2,小区3,小区4-cell5 //未料:如何更改为:小区4 - 细胞5第2页。

摘要:

我想设置

collectionView.contentSize = numberOfPage * collectionView.frame

collectionView.contentSize = numberOfCell * (cellFrame + spacing)

Answer 1:

你需要继承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中显示属性的能力。 您可以在编程设置它们init您的自定义UICollectionViewLayout子类的方法。 这里是我供参考:

- (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];
}


Answer 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);
}


Answer 3:

答案效果很好,但对我们的代码,我们有每页一个部分。 因此,它意味着覆盖了我们的布局类是刚

-(CGSize) collectionViewContentSize {
    return CGSizeMake(CGRectGetWidth(self.collectionView.frame) * 
                 [self.collectionView numberOfSections],
                 CGRectGetHeight(self.collectionView.frame)) ;
}


Answer 4:

我认为你必须继承UICollectionViewLayout并创建自定义布局管理这些类型的问题。



Answer 5:

我不需要任何的子类的答案。

在-viewDidLoad,计算出你有多少项目每页都有,你将多少个页面。 在性能存储这些值。

    self.numberOfItemsPerPage = NumberOfRows * NumberOfColumns;
    self.numberOfPages = ceilf((CGFloat)self.items.count / (CGFloat)self.numberOfItemsPerPage);

然后在-collectionView:numberOfItemsInSection:只是骗它:

    return self.numberOfItemsPerPage * self.numberOfPages;

当然,你将有以上内容的细胞,对不对? 因此,在-collectionView:cellForItemAtIndexPath:只返回零的额外电池:

    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;
    }

你去那里,丰满滚动最后一页。 在我看来,水平滚动模式应该只是默认了这一点。



Answer 6:

您还可以调节与内容viewDidLayoutSubviews:方法。 当集合视图,所有的细胞都置于此方法被调用view ,这样就可以调整细胞。



文章来源: How to expand UICollectionView contentSize when paging enable?