27

UICollectionViewページングメカニズムを有効にしてシンプルに作成していますが、すべて正常に動作します。ただし、最後のページにスクロールすると、セルの数が画面に完全に表示されず、最後のページに前のページのセルがいくつか含まれています。

最後のページに前のページのセルが含まれないように、contentSizeのを展開するにはどうすればよいですか?UICollectionView

ここでの例:UICollectionView6つのセルで水平方向にスクロールします。次のようになります。

  • ページ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);
}

ちなみに、カスタムレイアウトを使用すると、InterfaceBuilderで一部の表示プロパティを設定できなくなります。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

答えはうまくいきますが、私たちのコードでは、ページごとに1つのセクションがありました。つまり、レイアウトクラスのオーバーライドは

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

メソッドを使用してコンテンツを調整できますviewDidLayoutSubviews:。このメソッドは、コレクションビューとすべてのセルがに配置されたときに呼び出されるviewため、セルを調整できます。

于 2013-02-13T11:56:09.923 に答える
0

UICollectionViewLayoutこの種の問題を管理するには、サブクラス化してカスタムレイアウトを作成する必要があると思います。

于 2013-02-22T10:15:51.303 に答える
0

サブクラス化を必要としない答えがあります。

-viewDidLoadで、1ページあたりのアイテム数とページ数を計算します。これらの値をプロパティに保存します。

    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 に答える