Last active
November 6, 2016 01:49
-
-
Save litoarias/fb79a33d2914081cfd3356b43662fbe0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// CenterLayoutPaging.m | |
// POCCollection | |
// | |
// Created by Hipolito Arias on 5/11/16. | |
// Copyright © 2016 Hipolito Arias. All rights reserved. | |
// | |
#import "CenterLayoutPaging.h" | |
@implementation CenterLayoutPaging | |
- (void)awakeFromNib | |
{ | |
[super awakeFromNib]; | |
self.itemSize = CGSizeMake(CGRectGetWidth(self.collectionView.frame) / 2, CGRectGetHeight(self.collectionView.frame)); | |
self.minimumInteritemSpacing = 5.0; | |
self.minimumLineSpacing = 10.0; | |
self.scrollDirection = UICollectionViewScrollDirectionHorizontal; | |
self.sectionInset = UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0); | |
self.collectionView.pagingEnabled = YES; | |
self.collectionView.delegate = self; | |
} | |
- (CGSize)collectionViewContentSize | |
{ | |
// Only support single section for now. | |
// Only support Horizontal scroll | |
NSUInteger count = [self.collectionView.dataSource collectionView:self.collectionView | |
numberOfItemsInSection:0]; | |
CGSize canvasSize = self.collectionView.frame.size; | |
CGSize contentSize = canvasSize; | |
if (self.scrollDirection == UICollectionViewScrollDirectionHorizontal) | |
{ | |
NSUInteger rowCount = (canvasSize.height - self.itemSize.height) / (self.itemSize.height + self.minimumInteritemSpacing) + 1; | |
NSUInteger columnCount = (canvasSize.width - self.itemSize.width) / (self.itemSize.width + self.minimumLineSpacing) + 1; | |
NSUInteger page = ceilf((CGFloat)count / (CGFloat)(rowCount * columnCount)); | |
contentSize.width = page * canvasSize.width; | |
} | |
return contentSize; | |
} | |
- (CGRect)frameForItemAtIndexPath:(NSIndexPath *)indexPath | |
{ | |
CGSize canvasSize = self.collectionView.frame.size; | |
NSUInteger rowCount = (canvasSize.height - self.itemSize.height) / (self.itemSize.height + self.minimumInteritemSpacing) + 1; | |
NSUInteger columnCount = (canvasSize.width - self.itemSize.width) / (self.itemSize.width + self.minimumLineSpacing) + 1; | |
CGFloat pageMarginX = (canvasSize.width - columnCount * self.itemSize.width - (columnCount > 1 ? (columnCount - 1) * self.minimumLineSpacing : 0)) / 2.0f; | |
CGFloat pageMarginY = (canvasSize.height - rowCount * self.itemSize.height - (rowCount > 1 ? (rowCount - 1) * self.minimumInteritemSpacing : 0)) / 2.0f; | |
NSUInteger page = indexPath.row / (rowCount * columnCount); | |
NSUInteger remainder = indexPath.row - page * (rowCount * columnCount); | |
NSUInteger row = remainder / columnCount; | |
NSUInteger column = remainder - row * columnCount; | |
CGRect cellFrame = CGRectZero; | |
cellFrame.origin.x = pageMarginX + column * (self.itemSize.width + self.minimumLineSpacing); | |
cellFrame.origin.y = pageMarginY + row * (self.itemSize.height + self.minimumInteritemSpacing); | |
cellFrame.size.width = self.itemSize.width; | |
cellFrame.size.height = self.itemSize.height; | |
if (self.scrollDirection == UICollectionViewScrollDirectionHorizontal) | |
{ | |
cellFrame.origin.x += page * canvasSize.width; | |
} | |
return cellFrame; | |
} | |
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath | |
{ | |
UICollectionViewLayoutAttributes * attr = [super layoutAttributesForItemAtIndexPath:indexPath]; | |
attr.frame = [self frameForItemAtIndexPath:indexPath]; | |
return attr; | |
} | |
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect | |
{ | |
NSArray * originAttrs = [super layoutAttributesForElementsInRect:rect]; | |
NSMutableArray * attrs = [NSMutableArray array]; | |
[originAttrs enumerateObjectsUsingBlock:^(UICollectionViewLayoutAttributes * attr, NSUInteger idx, BOOL *stop) { | |
NSIndexPath * idxPath = attr.indexPath; | |
CGRect itemFrame = [self frameForItemAtIndexPath:idxPath]; | |
if (CGRectIntersectsRect(itemFrame, rect)) | |
{ | |
attr = [self layoutAttributesForItemAtIndexPath:idxPath]; | |
[attrs addObject:attr]; | |
} | |
}]; | |
return attrs; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment