iOS自定義UICollectionViewFlowLayout實現(xiàn)圖片瀏覽效果
以前瀑布流的時候使用過UICollectionView,但是那時使用的是系統(tǒng)自帶的UICollectionViewFlowLayout布局,今天看文章,看到UICollectionViewFlowLayout自定義相關(guān)的東西,于是動手寫了一個簡單圖片瀏覽的demo,熟練一些UICollectionViewFlowLayout自定義布局。
#import <UIKit/UIKit.h> @interface JWCollectionViewFlowLayout : UICollectionViewFlowLayout @end
自定義UICollectionViewFlowLayout,首先繼承UICollectionViewFlowLayout,實現(xiàn)一下幾個方法
#define screenWidth [UIScreen mainScreen].bounds.size.width #define MaxChangeRange 100 #import "JWCollectionViewFlowLayout.h" @implementation JWCollectionViewFlowLayout -(void)prepareLayout { self.scrollDirection = UICollectionViewScrollDirectionHorizontal; self.itemSize = CGSizeMake(300, 500); } - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { return YES; } - (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect { NSArray *array = [super layoutAttributesForElementsInRect:rect]; CGRect visibleRect = CGRectMake(self.collectionView.contentOffset.x, 0, self.collectionView.bounds.size.width, self.collectionView.bounds.size.height); for (UICollectionViewLayoutAttributes *attr in array) { if (CGRectIntersectsRect(attr.frame, rect)) { BOOL isAtRight = YES; CGFloat distance = (attr.center.x - CGRectGetMidX(visibleRect)); if (distance<0) { distance = -distance; isAtRight = NO; } CGFloat precent ; if (distance < 180) { precent = 1.0; } else { precent = ((screenWidth / 2) - distance) / (screenWidth / 2); } CATransform3D transform = CATransform3DIdentity; transform.m34 = 1.0 / 600; if (precent < 0.5) { precent = 0.5; } transform = CATransform3DScale(transform, 1, precent, 1); CGFloat p = isAtRight?M_PI_4:-M_PI_4; transform = CATransform3DRotate(transform, p * (1 - precent), 0, 1, 0); attr.transform3D = transform; attr.zIndex = 1; attr.alpha = precent; } } return array; } - (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity { CGFloat offset = MAXFLOAT; CGFloat hCenter = proposedContentOffset.x + (CGRectGetWidth(self.collectionView.bounds) / 2.0); CGRect currentRect = CGRectMake(proposedContentOffset.x, 0, self.collectionView.bounds.size.width, self.collectionView.bounds.size.height); NSArray* array = [super layoutAttributesForElementsInRect:currentRect]; for (UICollectionViewLayoutAttributes* layoutAttributes in array) { CGFloat itemHorizontalCenter = layoutAttributes.center.x; if (ABS(itemHorizontalCenter - hCenter) < ABS(offset)) { offset = itemHorizontalCenter - hCenter; } } return CGPointMake(proposedContentOffset.x + offset, proposedContentOffset.y); }
使用
-(void)setupUI { JWCollectionViewFlowLayout *flowLayout = [[JWCollectionViewFlowLayout alloc] init]; UICollectionView *imgBrowseView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:flowLayout]; imgBrowseView.dataSource = self; imgBrowseView.delegate = self; imgBrowseView.backgroundColor = [UIColor whiteColor]; [self.view addSubview:imgBrowseView]; _imgBrowseView = imgBrowseView; [self.imgBrowseView registerNib:[UINib nibWithNibName:@"CustumCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"cell"]; }
demo:https://github.com/jiangtaidi/JWImageBrowseDemo.git
運(yùn)行結(jié)果:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。
相關(guān)文章
iOS 中KVC、KVO、NSNotification、delegate 總結(jié)及區(qū)別
這篇文章主要介紹了iOS 中KVC、KVO、NSNotification、delegate 總結(jié)及區(qū)別的相關(guān)資料,需要的朋友可以參考下2016-10-10利用iOS開發(fā)實現(xiàn)翻轉(zhuǎn)撲克牌動畫的方法
這篇文章主要給大家介紹了關(guān)于利用iOS開發(fā)實現(xiàn)翻撲克牌動畫的方法,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07學(xué)習(xí)iOS自定義導(dǎo)航控制器UINavigationController
這篇文章主要為大家詳細(xì)介紹了iOS自定義導(dǎo)航控制器UINavigationController,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09iOS App使用SQLite之句柄的定義及數(shù)據(jù)庫的基本操作
SQLite中在定義過句柄之后就可以指向數(shù)據(jù)庫,從而利用iOS應(yīng)用程序進(jìn)行打開或關(guān)閉等各種操作,這里我們就來看一下iOS App使用SQLite之句柄的定義及數(shù)據(jù)庫的基本操作2016-06-06iOS開發(fā)中class和#import的區(qū)別介紹
這篇文章主要介紹了iOS開發(fā)中class和#import的區(qū)別,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2018-02-02ios實現(xiàn)底部PopupWindow的示例代碼(底部彈出菜單)
這篇文章主要介紹了ios實現(xiàn)底部PopupWindow的示例代碼(底部彈出菜單),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01