使用静态单元格

时间:2015-11-30 18:44:54

标签: ios objective-c uicollectionview

我有一个显示图像的3x3网格布局的UICollectionView。 UICollectionView具有" pagingEnabled"设置为YES,以及" page"在具有3x3网格和9个图像的页面之间。 这是使用自定义UICollectionViewLayout完成的:

@implementation HorizontalCollectionViewLayout

- (instancetype)init
{
    self = [super init];
    if (self) {
    }
    return self;
}

- (CGSize)collectionViewContentSize
{
    // We should return the content size. Lets do some math:

    NSInteger verticalItemsCount = (NSInteger)floorf(self.collectionView.bounds.size.height / self.itemSize.height);
    NSInteger horizontalItemsCount = (NSInteger)floorf(self.collectionView.bounds.size.width / self.itemSize.width);

    NSInteger itemsPerPage = verticalItemsCount * horizontalItemsCount;
    NSInteger numberOfItems = [self.collectionView numberOfItemsInSection:0];
    NSInteger numberOfPages = (NSInteger)ceilf((CGFloat)numberOfItems / (CGFloat)itemsPerPage);

    CGSize size = self.collectionView.bounds.size;
    size.width = numberOfPages * self.collectionView.bounds.size.width;
    return size;
}

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
    return YES;
}

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    // Get all the attributes for the elements in the specified frame
    NSArray *allAttributesInRect = [super layoutAttributesForElementsInRect:rect];
    NSArray *attributesArray = [[NSArray alloc] initWithArray:allAttributesInRect copyItems:YES];

    NSInteger verticalItemsCount = (NSInteger)floorf(self.collectionView.bounds.size.height / self.itemSize.height);
    NSInteger horizontalItemsCount = (NSInteger)floorf(self.collectionView.bounds.size.width / self.itemSize.width);
    NSInteger itemsPerPage = verticalItemsCount * horizontalItemsCount;

    for (NSInteger i = 0; i < attributesArray.count; i++) {        
        UICollectionViewLayoutAttributes *attributes = attributesArray[i]; 
        NSInteger currentPage = (NSInteger)floor((double)i / (double)itemsPerPage);
        NSInteger currentRow = (NSInteger)floor((double)(i - currentPage * itemsPerPage) / (double)horizontalItemsCount);
        NSInteger currentColumn = i % horizontalItemsCount;
        CGRect frame = attributes.frame;
        frame.origin.x = self.itemSize.width * currentColumn + currentPage * self.collectionView.bounds.size.width;
        frame.origin.y = self.itemSize.height * currentRow;

        CGRect f = UIEdgeInsetsInsetRect(frame, UIEdgeInsetsMake(2, 2, 5, 2));

        attributes.frame = f;

    }
    return attributesArray;
}


@end

这是按预期工作的,因为当第一页包含9张图像时,它会创建一个新页面。

我想要完成的是创建一个静态/固定的#34;下一页&#34;根据页数,索引8,17,26,35的网格右下角的按钮。 (如果collectionview只有1页,索引为8的按钮,索引为8的按钮,如果collectionview只有2页,则为索引17 ......等等)。图像和页面的数量可以根据用户上传到应用程序的图像数量而有所不同。

下图说明了这个想法:

enter image description here

关于如何实现这一目标的任何提示? 什么逻辑应该进入"collectionView:itemForIndexPath:"

1 个答案:

答案 0 :(得分:1)

在你的cellForItemAtIndexPath中查看indexPath.item,了解您有兴趣替换的数字,并返回[&gt;]的集合视图单元格。 ]按钮。

集合视图的工作方式是您从不真正关心屏幕上的可见单元格(您的UICollectionViewLayout正在处理它)。您只返回给定indexPath的单元格。

为此创建专用的UICollectionViewCell子类[&gt; ]具有自己的重用标识符的单元。它将简化您的代码,您不需要触摸当前的图像单元格。