123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- //
- // MWGridViewController.m
- // MWPhotoBrowser
- //
- // Created by Michael Waterfall on 08/10/2013.
- //
- //
- #import "MWGridViewController.h"
- #import "MWGridCell.h"
- #import "MWPhotoBrowserPrivate.h"
- #import "MWCommon.h"
- @interface MWGridViewController () {
-
- // Store margins for current setup
- CGFloat _margin, _gutter, _marginL, _gutterL, _columns, _columnsL;
-
- }
- @end
- @implementation MWGridViewController
- - (id)init {
- if ((self = [super initWithCollectionViewLayout:[UICollectionViewFlowLayout new]])) {
-
- // Defaults
- _columns = 3, _columnsL = 4;
- _margin = 0, _gutter = 1;
- _marginL = 0, _gutterL = 1;
-
- // For pixel perfection...
- if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
- // iPad
- _columns = 6, _columnsL = 8;
- _margin = 1, _gutter = 2;
- _marginL = 1, _gutterL = 2;
- } else if ([UIScreen mainScreen].bounds.size.height == 480) {
- // iPhone 3.5 inch
- _columns = 3, _columnsL = 4;
- _margin = 0, _gutter = 1;
- _marginL = 1, _gutterL = 2;
- } else {
- // iPhone 4 inch
- _columns = 3, _columnsL = 5;
- _margin = 0, _gutter = 1;
- _marginL = 0, _gutterL = 2;
- }
- _initialContentOffset = CGPointMake(0, CGFLOAT_MAX);
-
- }
- return self;
- }
- #pragma mark - View
- - (void)viewDidLoad {
- [super viewDidLoad];
- [self.collectionView registerClass:[MWGridCell class] forCellWithReuseIdentifier:@"GridCell"];
- self.collectionView.alwaysBounceVertical = YES;
- self.collectionView.backgroundColor = [UIColor blackColor];
- }
- - (void)viewWillDisappear:(BOOL)animated {
- // Cancel outstanding loading
- NSArray *visibleCells = [self.collectionView visibleCells];
- if (visibleCells) {
- for (MWGridCell *cell in visibleCells) {
- [cell.photo cancelAnyLoading];
- }
- }
- [super viewWillDisappear:animated];
- }
- - (void)viewWillLayoutSubviews {
- [super viewWillLayoutSubviews];
- [self performLayout];
- }
- - (void)viewDidLayoutSubviews {
- [super viewDidLayoutSubviews];
- }
- - (void)adjustOffsetsAsRequired {
-
- // Move to previous content offset
- if (_initialContentOffset.y != CGFLOAT_MAX) {
- self.collectionView.contentOffset = _initialContentOffset;
- [self.collectionView layoutIfNeeded]; // Layout after content offset change
- }
-
- // Check if current item is visible and if not, make it so!
- if (_browser.numberOfPhotos > 0) {
- NSIndexPath *currentPhotoIndexPath = [NSIndexPath indexPathForItem:_browser.currentIndex inSection:0];
- NSArray *visibleIndexPaths = [self.collectionView indexPathsForVisibleItems];
- BOOL currentVisible = NO;
- for (NSIndexPath *indexPath in visibleIndexPaths) {
- if ([indexPath isEqual:currentPhotoIndexPath]) {
- currentVisible = YES;
- break;
- }
- }
- if (!currentVisible) {
- [self.collectionView scrollToItemAtIndexPath:currentPhotoIndexPath atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
- }
- }
-
- }
- - (void)performLayout {
- UINavigationBar *navBar = self.navigationController.navigationBar;
- self.collectionView.contentInset = UIEdgeInsetsMake(navBar.frame.origin.y + navBar.frame.size.height + [self getGutter], 0, 0, 0);
- }
- - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
- [self.collectionView reloadData];
- [self performLayout]; // needed for iOS 5 & 6
- }
- #pragma mark - Layout
- - (CGFloat)getColumns {
- if ((UIInterfaceOrientationIsPortrait(self.interfaceOrientation))) {
- return _columns;
- } else {
- return _columnsL;
- }
- }
- - (CGFloat)getMargin {
- if ((UIInterfaceOrientationIsPortrait(self.interfaceOrientation))) {
- return _margin;
- } else {
- return _marginL;
- }
- }
- - (CGFloat)getGutter {
- if ((UIInterfaceOrientationIsPortrait(self.interfaceOrientation))) {
- return _gutter;
- } else {
- return _gutterL;
- }
- }
- #pragma mark - Collection View
- - (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section {
- return [_browser numberOfPhotos];
- }
- - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
- MWGridCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"GridCell" forIndexPath:indexPath];
- if (!cell) {
- cell = [[MWGridCell alloc] init];
- }
- id <MWPhoto> photo = [_browser thumbPhotoAtIndex:indexPath.row];
- cell.photo = photo;
- cell.gridController = self;
- cell.selectionMode = _selectionMode;
- cell.isSelected = [_browser photoIsSelectedAtIndex:indexPath.row];
- cell.index = indexPath.row;
- UIImage *img = [_browser imageForPhoto:photo];
- if (img) {
- [cell displayImage];
- } else {
- [photo loadUnderlyingImageAndNotify];
- }
- return cell;
- }
- - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
- [_browser setCurrentPhotoIndex:indexPath.row];
- [_browser hideGrid];
- }
- - (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
- [((MWGridCell *)cell).photo cancelAnyLoading];
- }
- - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
- CGFloat margin = [self getMargin];
- CGFloat gutter = [self getGutter];
- CGFloat columns = [self getColumns];
- CGFloat value = floorf(((self.view.bounds.size.width - (columns - 1) * gutter - 2 * margin) / columns));
- return CGSizeMake(value, value);
- }
- - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
- return [self getGutter];
- }
- - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
- return [self getGutter];
- }
- - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
- CGFloat margin = [self getMargin];
- return UIEdgeInsetsMake(margin, margin, margin, margin);
- }
- @end
|