ページングメカニズムを有効にして簡単なUICollectionView
を作成していますが、すべて正常に動作します。ただし、最後のページまでスクロールすると、セルの数は画面に完全には表示されず、最後のページには前のページのいくつかのセルが含まれます。
最後のページに前のページのセルが含まれないようにcontentSize
のUICollectionView
を展開するにはどうすればよいですか?
例 here :UICollectionView
は、次のように6つのセルで水平にスクロールします。
ページ1:_cell0 - cell1 - cell2 - cell3
_
スクロール:cell2-cell3-cell4-cell5 //予期しない:変更方法:cell4-ページ2のセル5.
SUMMARY:
設定したい
_collectionView.contentSize = numberOfPage * collectionView.frame
_
[〜#〜] not [〜#〜]
collectionView.contentSize = numberOfCell * (cellFrame + spacing)
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];
}
水平ページング用
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);
}
答えはうまくいきましたが、コードではページごとに1つのセクションがありました。したがって、レイアウトクラスのオーバーライドは単に
-(CGSize) collectionViewContentSize {
return CGSizeMake(CGRectGetWidth(self.collectionView.frame) *
[self.collectionView numberOfSections],
CGRectGetHeight(self.collectionView.frame)) ;
}
サブクラス化を必要としない答えがあります。
-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;
}
完了です。スクロール可能な最終ページです。私の意見では、水平スクロールモードはデフォルトでこれになっているはずです。
これらの問題を管理するには、UICollectionViewLayout
をサブクラス化し、カスタムレイアウトを作成する必要があると思います。