我做一个简单的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)
你需要继承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];
}
对于水平分页
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);
}
答案效果很好,但对我们的代码,我们有每页一个部分。 因此,它意味着覆盖了我们的布局类是刚
-(CGSize) collectionViewContentSize {
return CGSizeMake(CGRectGetWidth(self.collectionView.frame) *
[self.collectionView numberOfSections],
CGRectGetHeight(self.collectionView.frame)) ;
}
我认为你必须继承UICollectionViewLayout
并创建自定义布局管理这些类型的问题。
我不需要任何的子类的答案。
在-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;
}
你去那里,丰满滚动最后一页。 在我看来,水平滚动模式应该只是默认了这一点。
您还可以调节与内容viewDidLayoutSubviews:
方法。 当集合视图,所有的细胞都置于此方法被调用view
,这样就可以调整细胞。