27

我正在制作一个UICollectionView启用了分页机制的简单程序,一切正常。但是,当滚动到最后一页时,单元格的数量在屏幕上并不完全可见,并且最后一页包含上一页的一些单元格。

如何展开contentSizeUICollectionView使最后一页不包含上一页的任何单元格?

这里的一个例子:UICollectionView水平滚动 6 个单元格,这样:

  • 第 1 页:

    cell0 - cell1 - cell2 - cell3

  • 第2页:

    cell4 - cell5意料之中,但出乎意料

    cell2 - cell3 - cell4 - cell5

如何改变它?

概括:

我想设置

collectionView.contentSize = numberOfPage * collectionView.frame

不是

collectionView.contentSize = numberOfCell * (cellFrame + spacing)

4

6 回答 6

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 中设置某些显示属性。您可以在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];
}
于 2013-02-25T20:45:04.737 回答
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);
}
于 2013-06-19T12:26:52.233 回答
1

答案很有效,尽管对于我们的代码,我们每页只有一个部分。所以这意味着我们的布局类的覆盖只是

-(CGSize) collectionViewContentSize {
    return CGSizeMake(CGRectGetWidth(self.collectionView.frame) * 
                 [self.collectionView numberOfSections],
                 CGRectGetHeight(self.collectionView.frame)) ;
}
于 2013-07-15T17:19:36.467 回答
0

我认为您必须子类UICollectionViewLayout化并创建自定义布局来管理此类问题。

于 2013-02-22T10:15:51.303 回答
0

您可以使用viewDidLayoutSubviews:方法调整内容。当集合视图和所有单元格放置在 中时,将调用此方法view,以便您可以调整单元格。

于 2013-02-13T11:56:09.923 回答
0

我有一个不需要任何子类化的答案。

在 -viewDidLoad 中,计算每页将拥有多少项目以及将拥有多少页。将这些值存储在属性中。

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

然后在 -collectionView:numberOfItemsInSection: 中撒谎:

    return self.numberOfItemsPerPage * self.numberOfPages;

你当然会拥有比内容更多的单元格,对吧?所以在 -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;
    }

你去:完整的,可滚动的最后一页。在我看来,水平滚动模式应该默认为这个。

于 2013-12-12T21:55:36.643 回答