亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS使用UICollectionView實現橫向滾動照片效果

2020-07-26 02:19:57
字體:
來源:轉載
供稿:網友

本文實例為大家分享了iOS使用UICollectionView實現橫向滾動展示照片的具體代碼,供大家參考,具體內容如下

這是Demo鏈接

效果圖

思路

1. 界面搭建

界面的搭建十分簡單,采用UICollectionView和自定義cell進行搭建即可。

// ViewController.m// 下面使用到的宏和全局變量#define ScreenW [UIScreen mainScreen].bounds.size.width#define ScreenH [UIScreen mainScreen].bounds.size.heightstatic NSString *const cellID = @"cellID";// 創建collectionView的代碼- (void)setupCollectionView{ // 使用系統自帶的流布局(繼承自UICollectionViewLayout) UICollectionViewFlowLayout *layout = ({ UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; // 每個cell的大小 layout.itemSize   = CGSizeMake(180, 180); // 橫向滾動 layout.scrollDirection  = UICollectionViewScrollDirectionHorizontal; // cell間的間距 layout.minimumLineSpacing  = 40; //第一個cell和最后一個cell居中顯示(這里我的Demo里忘記改了我用的是160,最后微調數據cell的大小是180) CGFloat margin = (ScreenW - 180) * 0.5; layout.sectionInset  = UIEdgeInsetsMake(0, margin, 0, margin); layout; }); // 使用UICollectionView必須設置UICollectionViewLayout屬性 UICollectionView *collectionView = ({ UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; collectionView.center  = self.view.center; collectionView.bounds  = CGRectMake(0, 0, ScreenW, 200); collectionView.backgroundColor = [UIColor brownColor]; // 這里千萬記得在interface哪里寫<UICollectionViewDataSource>!??! collectionView.dataSource = self; [collectionView setShowsHorizontalScrollIndicator:NO]; [self.view addSubview:collectionView]; collectionView; }); // 實現注冊cell,其中PhotoCell是我自定義的cell,繼承自UICollectionViewCell UINib *collectionNib = [UINib nibWithNibName:NSStringFromClass([PhotoCell class])      bundle:nil]; [collectionView registerNib:collectionNib forCellWithReuseIdentifier:cellID];}// UICollectionViewCellDataSource- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ return 10;}- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView    cellForItemAtIndexPath:(NSIndexPath *)indexPath{ PhotoCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID     forIndexPath:indexPath]; // 圖片名是 0 ~ 9 cell.imageName = [NSString stringWithFormat:@"%ld", (long)indexPath.row]; return cell;}
// 界面是一個xib文件,在cell里拖了個ImageView,約束上下左右都是10// 圖片名是數字 0 ~ 9// PhotoCell.h@property (nonatomic, strong) NSString *imageName;// PhotoCell.m@interface PhotoCell ()@property (weak, nonatomic) IBOutlet UIImageView *imageView;@end@implementation PhotoCell- (void)awakeFromNib { [super awakeFromNib]; // Initialization code}- (void)setImageName:(NSString *)imageName{ _imageName = imageName; self.imageView.image = [UIImage imageNamed:imageName];}

到這里最基礎的效果就實現完了,一組大小相等的圖片cell。

2.大小變化已經居中效果實現

由于系統的UICollectionViewFlowLayout無法實現我想要的效果,因此我重寫下該類中的某些方法。
在UICollectionViewLayout中有這樣兩句注釋:

1. Methods in this class are meant to be overridden and will be called by its collection view to gather layout information.
在這個類中的方法意味著被重寫(overridden),并且將要被它的 collection view 調用,用于收集布局信息

2. To get the truth on the current state of the collection view, call methods on UICollectionView rather than these.
要獲取 collection view 的當前狀態的真相,調用UICollectionView上的方法,而不是這些
其中有一點需要解釋下,collectionView的bounds的x和y實際上就是collectionView的內容視圖的 x和y。關于這點,請看我寫的一篇博文的解釋:iOS bounds學習筆記以及仿寫UIScrollView的部分功能

// MyFlowLayout.h#import <UIKit/UIKit.h>// 注意!繼承自UICollectionViewFlowLayout,因為它繼承自UICollectionViewLayout。@interface TWLayout : UICollectionViewFlowLayout// MyFlowLayout.m/** * The default implementation of this method returns NO. Subclasses can override it and return an appropriate value based on whether changes in the bounds of the collection view require changes to the layout of cells and supplementary views. 此方法的默認實現返回NO。 子類可以覆蓋它,并根據 collection view 的 bounds 中的更改是否需要更改 cells 和 supplementary views(補充視圖) 的布局返回適當的值。 * If the bounds of the collection view change and this method returns YES, the collection view invalidates the layout by calling the invalidateLayoutWithContext: method. 如果 collection view 的 bounds 更改并且此方法返回YES,則 collection view 通過調用invalidateLayoutWithContext:方法使布局更新。 @param newBounds The new bounds of the collection view. @return YES if the collection view requires a layout update or NO if the layout does not need to change. */- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{ return YES;}/** * Returns the layout attributes for all of the cells and views in the specified rectangle. 返回指定矩形中所有cells和views的布局屬性。 @param rect * The rectangle (specified in the collection view's coordinate system) containing the target views.  包含目標視圖的矩形(在集合視圖的坐標系中指定)。 @return * An array of UICollectionViewLayoutAttributes objects representing the layout information for the cells and views. The default implementation returns nil.  UICollectionViewLayoutAttributes對象數組,表示cell和view的布局信息。默認實現返回nil。 */- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{ // 獲取collectionView的寬帶 CGFloat collectionW = self.collectionView.bounds.size.width; // 獲取布局屬性數組 NSArray<UICollectionViewLayoutAttributes *> *attrs = [super layoutAttributesForElementsInRect:self.collectionView.bounds]; for (int i = 0; i < attrs.count; i++) { UICollectionViewLayoutAttributes *attr = attrs[i]; //每個顯示的cell距離中心距離 CGFloat margin = fabs((attr.center.x - self.collectionView.contentOffset.x) - collectionW * 0.5); // 縮放比例:(margin / (collectionW * 0.5))得出的結論相當于 0 ~ 1。而我們需要它的縮放比例是 1 ~ 0.65,這樣就是 (1 - 0)~(1 - 0.35) CGFloat scale = 1 - (margin / (collectionW * 0.5)) * 0.35; attr.transform = CGAffineTransformMakeScale(scale, scale); } return attrs;}/** * Returns the point at which to stop scrolling. * 關于這個方法,最終的偏移量,并不是由手指滑動過的偏移量決定的。如果手指滑動比較快,手指滑動過后,視圖還會多滾動一段距離;如果手指滑動緩慢,手指滑到何處,就停到何處。 @param proposedContentOffset 建議的點(在集合視圖的內容視圖的坐標空間中)用于可見內容的左上角。 這表示集合視圖計算為在動畫結束時最可能使用的值。 @param velocity 沿著水平軸和垂直軸的當前滾動速度。 該值以每秒點數為單位。 @return 要使用的內容偏移量。 此方法的默認實現返回proposedContentOffset參數中的值。 */- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity{ // 獲取collectionView的寬度 CGFloat collectionW = self.collectionView.bounds.size.width; // 獲取當前的內容偏移量 CGPoint targetP = proposedContentOffset; // 獲取顯示cell的布局屬性數組,橫向滾動,所以只用考慮橫向的x和width,縱向不用考慮 NSArray *attrs = [super layoutAttributesForElementsInRect:CGRectMake(targetP.x, 0, collectionW, MAXFLOAT)]; // 距離中心點最近的cell的間距(中間那個cell距離最近,值可正可負) CGFloat minSpacing = MAXFLOAT; for (UICollectionViewLayoutAttributes *attr in attrs) { // 距離中心點的偏移量 CGFloat centerOffsetX = attr.center.x - targetP.x - collectionW * 0.5; // fabs():CGFloat絕對值 if (fabs(centerOffsetX) < fabs(minSpacing)) {  minSpacing = centerOffsetX; } } targetP.x += minSpacing; return targetP;}

最后,記得把 UICollectionViewFlowLayout 改成你自定義的FlowLayout對象??!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美中文字幕在线播放| 国产精品成人品| 亚洲国产精彩中文乱码av| 欧美一级免费看| 中文字幕日韩欧美在线视频| 在线观看欧美日韩| 国产日韩中文字幕在线| 一区二区三区精品99久久| 国产成人91久久精品| 91精品国产高清久久久久久91| 成人做爽爽免费视频| 色樱桃影院亚洲精品影院| 亚洲精品av在线| 麻豆精品精华液| 亚洲精品美女免费| 欧美激情久久久久| 北条麻妃99精品青青久久| 日韩最新在线视频| 久久精品久久久久久| 成人国产精品日本在线| 国产精品男人爽免费视频1| 国产亚洲视频在线| 菠萝蜜影院一区二区免费| 亚洲男人的天堂在线| 亚洲天堂免费在线| 性欧美xxxx视频在线观看| 国产日韩欧美影视| 69视频在线免费观看| 68精品久久久久久欧美| 亚洲专区国产精品| 亚洲免费高清视频| 亚洲国产精品久久久久秋霞蜜臀| 欧美色视频日本高清在线观看| 亚洲区bt下载| 久久亚洲精品小早川怜子66| 日本成人精品在线| 精品国产欧美一区二区三区成人| 亚洲一区二区三| 国产精品69精品一区二区三区| 国产91|九色| 日韩成人在线视频观看| 国产成人精品av在线| 国产精品白丝jk喷水视频一区| 国产第一区电影| 日韩美女视频中文字幕| 欧美久久精品午夜青青大伊人| 久久久中文字幕| 亚洲人午夜精品免费| 欧美精品第一页在线播放| 7777免费精品视频| 日本久久久久亚洲中字幕| 欧美精品一区二区三区国产精品| 欧美黄网免费在线观看| 欧美性受xxxx白人性爽| 亚洲欧美综合v| 日韩精品在线第一页| 欧美日韩激情网| 久久精品国产亚洲7777| 4444欧美成人kkkk| 国模叶桐国产精品一区| 欧美中文字幕视频| 日韩欧美成人精品| 国产综合久久久久久| 欧美激情精品久久久久久久变态| 日韩精品福利网站| 热久久视久久精品18亚洲精品| 亚洲图片欧美日产| 91av在线免费观看| 羞羞色国产精品| 亚洲自拍偷拍色图| 欧美资源在线观看| 国产偷国产偷亚洲清高网站| 亚洲天堂av在线播放| 2019中文字幕全在线观看| 中文字幕亚洲欧美| 91国偷自产一区二区三区的观看方式| 成人激情春色网| 国产成+人+综合+亚洲欧洲| 亚洲一区二区三区乱码aⅴ| 亚洲国产精品热久久| 欧美肥老太性生活视频| 青青草成人在线| 91国产中文字幕| 亚洲色图综合久久| 国产精品国产三级国产aⅴ9色| 国产成人精品最新| 国产精品高潮呻吟视频| 国产精品高潮呻吟久久av黑人| 一区二区三区黄色| 欧美精品成人91久久久久久久| 欧美黑人视频一区| 欧美视频中文字幕在线| 久久久国产精品x99av| 第一福利永久视频精品| 欧美成人免费va影院高清| 色婷婷亚洲mv天堂mv在影片| 亚洲图片欧美日产| 成人高h视频在线| 欧美激情一区二区三区在线视频观看| 亚洲国产中文字幕久久网| 亚洲aa中文字幕| 日韩欧美亚洲国产一区| 在线观看欧美成人| 日韩av电影中文字幕| 国产精品青青在线观看爽香蕉| 日本精品视频在线播放| 国产精品视频最多的网站| 狠狠综合久久av一区二区小说| 乱亲女秽乱长久久久| 91精品国产自产91精品| 精品国偷自产在线视频| 亚洲欧美日韩中文在线制服| 97av在线播放| 在线性视频日韩欧美| 91精品国产91久久久久久最新| 色综合91久久精品中文字幕| 亚洲天堂成人在线视频| 亚洲精品国产精品自产a区红杏吧| 久久久久久欧美| 久久精品国产一区| 国产一区二区三区久久精品| 日本国产高清不卡| 精品视频久久久| 国产精品男人爽免费视频1| 成人免费在线网址| 8x拔播拔播x8国产精品| 91久久久久久久久久| 亚洲人成网站免费播放| 欧美小视频在线| 久久久久国色av免费观看性色| 亚洲国产精品va在线观看黑人| 国产99久久精品一区二区永久免费| 亚洲美女av网站| 性欧美在线看片a免费观看| 亚洲精品wwwww| 欧美片一区二区三区| 国产女精品视频网站免费| 8090理伦午夜在线电影| 亚洲精品电影在线| 国产日本欧美一区二区三区在线| 日韩电影在线观看免费| 国产精品国产三级国产aⅴ浪潮| 成人午夜激情网| 国产美女久久精品香蕉69| 成人av色在线观看| 91精品久久久久久综合乱菊| 亚洲欧美另类人妖| 亚洲人成电影在线观看天堂色| 亚洲欧美日韩区| 亚洲精品在线观看www| 亚洲精品自拍视频| 8050国产精品久久久久久| 最近2019免费中文字幕视频三| 国产欧美日韩中文字幕在线| 久久精品国产欧美激情| 成人av在线亚洲| 91嫩草在线视频| 欧美日韩国产精品专区| 国产精品99久久久久久久久| 亚洲精品美女视频| 精品久久久久久国产91| 欧美裸体xxxx极品少妇| 亚洲精品98久久久久久中文字幕| 人人爽久久涩噜噜噜网站|