成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

ios uicollectionview實現橫向滾動

瀏覽:7日期:2022-09-17 10:41:05

現在使用卡片效果的app很多,之前公司讓實現一種卡片效果,就寫了一篇關于實現卡片的文章。文章最后附有demo實現上我選擇了使用UICollectionView ;用UICollectionViewFlowLayout來定制樣式;下面看看具體實現

效果

ios uicollectionview實現橫向滾動

實現上我選擇了使用UICollectionView ;用UICollectionViewFlowLayout來定制樣式;下面看看具體實現

具體實現

1、ViViewController.m 代碼實現

#import 'ViewController.h'#import 'CollModel.h'#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height#define SCREEN_RATE ([UIScreen mainScreen].bounds.size.width/375.0)#import 'imageCell.h'#import 'LHHorizontalPageFlowlayout.h'static NSString * const imageC = @'imageCell';static NSString * const moreImageC = @'imageCell';static const NSInteger kItemCountPerRow = 5; //每行顯示5個static const NSInteger kRowCount = 3; //每頁顯示行數static float imageHeight = 80;//cell 高度@interface ViewController ()<UICollectionViewDelegate,UICollectionViewDataSource>@property (nonatomic, strong) UICollectionView * collectionView;@property (nonatomic, strong) NSMutableArray * modelArray;@property (nonatomic, strong) UICollectionView * moreCollectionView;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; NSArray *appArray = [[self getDict] objectForKey:@'dictInfo']; for (int i = 0; i < appArray.count; i++) { NSDictionary * appDic = appArray[i]; CollModel * model = [[CollModel alloc]init]; model.title = [appDic objectForKey:@'title']; model.url = [appDic objectForKey:@'url']; [self.modelArray addObject:model]; } [self createCollectionView]; [self createRightCollectionView];}- (NSDictionary *)getDict { NSString * string = @'{'dictInfo':[{'title':'你好啊','url':'1.jpeg'},{'title':'你好啊','url':'2.jpeg'},{'title':'你好啊','url':'3.jpeg'},{'title':'你好啊','url':'4.jpeg'},{'title':'你好啊','url':'5.jpeg'},{'title':'你好啊','url':'6.jpeg'},{'title':'是很好','url':'7.jpeg'},{'title':'你好啊','url':'1.jpeg'},{'title':'你好啊','url':'2.jpeg'},{'title':'你好啊','url':'3.jpeg'},{'title':'你好啊','url':'4.jpeg'},{'title':'你好啊','url':'5.jpeg'},{'title':'你好啊','url':'6.jpeg'},{'title':'是很好','url':'7.jpeg'},{'title':'你好啊','url':'1.jpeg'},{'title':'你好啊','url':'2.jpeg'},{'title':'你好啊','url':'3.jpeg'},{'title':'你好啊','url':'4.jpeg'},{'title':'你好啊','url':'5.jpeg'},{'title':'你好啊','url':'6.jpeg'},{'title':'是很好','url':'7.jpeg'}]}'; NSDictionary *infoDic = [self dictionaryWithJsonString:string]; return infoDic;}-(NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString { if (jsonString == nil) { return nil; } NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *err; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; if(err) { NSLog(@'json解析失敗:%@',err); return nil; } return dic;}- (NSMutableArray *)modelArray { if (!_modelArray) { _modelArray = [NSMutableArray array]; } return _modelArray;}- (void)createCollectionView{ UICollectionViewFlowLayout * layout = [[UICollectionViewFlowLayout alloc]init]; layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; layout.minimumLineSpacing = 0; layout.minimumInteritemSpacing = 0; _collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width, imageHeight * SCREEN_RATE) collectionViewLayout:layout]; _collectionView.tag = 11; _collectionView.backgroundColor = [UIColor colorWithRed:186 / 255.0 green:186 / 255.0 blue:186 / 255.0 alpha:0.9]; _collectionView.dataSource = self; _collectionView.delegate = self; _collectionView.bounces = NO; _collectionView.alwaysBounceHorizontal = YES; _collectionView.alwaysBounceVertical = NO; _collectionView.showsHorizontalScrollIndicator = NO; _collectionView.showsVerticalScrollIndicator = NO; [self.view addSubview:_collectionView]; [_collectionView registerClass:[imageCell class] forCellWithReuseIdentifier:imageC];}- (void)createRightCollectionView{ LHHorizontalPageFlowlayout * layout = [[LHHorizontalPageFlowlayout alloc] initWithRowCount:kRowCount itemCountPerRow:kItemCountPerRow]; [layout setColumnSpacing:0 rowSpacing:0 edgeInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; // UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init]; // layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; layout.minimumLineSpacing = 0; layout.minimumInteritemSpacing = 0; _moreCollectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 300, [UIScreen mainScreen].bounds.size.width, imageHeight * SCREEN_RATE * kRowCount) collectionViewLayout:layout]; _moreCollectionView.backgroundColor = [UIColor clearColor]; _moreCollectionView.tag = 22; _moreCollectionView.dataSource = self; _moreCollectionView.delegate = self; _moreCollectionView.bounces = NO; _moreCollectionView.alwaysBounceHorizontal = YES; _moreCollectionView.alwaysBounceVertical = NO; _moreCollectionView.backgroundColor = [UIColor colorWithRed:186 / 255.0 green:186 / 255.0 blue:186 / 255.0 alpha:0.9]; _moreCollectionView.showsHorizontalScrollIndicator = NO; _moreCollectionView.showsVerticalScrollIndicator = NO; [self.view addSubview:_moreCollectionView]; [_moreCollectionView registerClass:[imageCell class] forCellWithReuseIdentifier:moreImageC];}- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ return self.modelArray.count;}- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { CollModel * model = self.modelArray[indexPath.row]; imageCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:imageC forIndexPath:indexPath]; cell.itemModel = model; return cell;}// 返回每個item的大小- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { CGFloat CWidth = imageHeight * SCREEN_RATE; CGFloat CHeight = imageHeight * SCREEN_RATE; return CGSizeMake(CWidth, CHeight);}#pragma mark - UICollectionViewDelegate點擊事件- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ CollModel * model = self.modelArray[indexPath.row]; NSLog(@'self.appModelArray----%@',model.title);}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}@end

2、自定義UICollectionViewFlowLayout

LHHorizontalPageFlowlayout.h 實現

#import <UIKit/UIKit.h>@interface LHHorizontalPageFlowlayout : UICollectionViewFlowLayout/** 列間距 */@property (nonatomic, assign) CGFloat columnSpacing;/** 行間距 */@property (nonatomic, assign) CGFloat rowSpacing;/** collectionView的內邊距 */@property (nonatomic, assign) UIEdgeInsets edgeInsets;/** 多少行 */@property (nonatomic, assign) NSInteger rowCount;/** 每行展示多少個item */@property (nonatomic, assign) NSInteger itemCountPerRow;//固定寬度@property (nonatomic, assign) CGFloat itemWidth; //設置完這個,就會自動計算列間距//固定高度@property (nonatomic, assign) CGFloat itemHight;//設置完這個,就會自動計算行間距/** 所有item的屬性數組 */@property (nonatomic, strong) NSMutableArray *attributesArrayM;/** 設置行列間距及collectionView的內邊距 */- (void)setColumnSpacing:(CGFloat)columnSpacing rowSpacing:(CGFloat)rowSpacing edgeInsets:(UIEdgeInsets)edgeInsets;/** 設置多少行及每行展示的item個數 */- (void)setRowCount:(NSInteger)rowCount itemCountPerRow:(NSInteger)itemCountPerRow;#pragma mark - 構造方法/** 設置多少行及每行展示的item個數 */+ (instancetype)horizontalPageFlowlayoutWithRowCount:(NSInteger)rowCount itemCountPerRow:(NSInteger)itemCountPerRow;/** 設置多少行及每行展示的item個數 */- (instancetype)initWithRowCount:(NSInteger)rowCount itemCountPerRow:(NSInteger)itemCountPerRow;@end

LHHorizontalPageFlowlayout.m 實現

#import 'LHHorizontalPageFlowlayout.h'@implementation LHHorizontalPageFlowlayout#pragma mark - Public- (void)setColumnSpacing:(CGFloat)columnSpacing rowSpacing:(CGFloat)rowSpacing edgeInsets:(UIEdgeInsets)edgeInsets{ self.columnSpacing = columnSpacing; self.rowSpacing = rowSpacing; self.edgeInsets = edgeInsets;}- (void)setRowCount:(NSInteger)rowCount itemCountPerRow:(NSInteger)itemCountPerRow{ self.rowCount = rowCount; self.itemCountPerRow = itemCountPerRow;}#pragma mark - 構造方法+ (instancetype)horizontalPageFlowlayoutWithRowCount:(NSInteger)rowCount itemCountPerRow:(NSInteger)itemCountPerRow{ return [[self alloc] initWithRowCount:rowCount itemCountPerRow:itemCountPerRow];}- (instancetype)initWithRowCount:(NSInteger)rowCount itemCountPerRow:(NSInteger)itemCountPerRow{ self = [super init]; if (self) { self.rowCount = rowCount; self.itemCountPerRow = itemCountPerRow; } return self;}#pragma mark - 重寫父類方法- (instancetype)init{ self = [super init]; if (self) { [self setColumnSpacing:0 rowSpacing:0 edgeInsets:UIEdgeInsetsZero]; } return self;}/** 布局前做一些準備工作 */- (void)prepareLayout{ [super prepareLayout]; if (self.attributesArrayM && self.attributesArrayM.count > 0) { [self.attributesArrayM removeAllObjects]; } // 從collectionView中獲取到有多少個item NSInteger itemTotalCount = [self.collectionView numberOfItemsInSection:0]; // 遍歷出item的attributes,把它添加到管理它的屬性數組中去 for (int i = 0; i < itemTotalCount; i++) { NSIndexPath *indexpath = [NSIndexPath indexPathForItem:i inSection:0]; UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexpath]; [self.attributesArrayM addObject:attributes]; }}/** 計算collectionView的滾動范圍 */- (CGSize)collectionViewContentSize{ // 計算出item的寬度 CGFloat itemWidth = (self.collectionView.frame.size.width - self.edgeInsets.left - self.itemCountPerRow * self.columnSpacing) / self.itemCountPerRow; // 從collectionView中獲取到有多少個item NSInteger itemTotalCount = [self.collectionView numberOfItemsInSection:0]; // 理論上每頁展示的item數目 NSInteger itemCount = self.rowCount * self.itemCountPerRow; // 余數(用于確定最后一頁展示的item個數) NSInteger remainder = itemTotalCount % itemCount; // 除數(用于判斷頁數) NSInteger pageNumber = itemTotalCount / itemCount; // 總個數小于self.rowCount * self.itemCountPerRow if (itemTotalCount <= itemCount) { pageNumber = 1; }else { if (remainder == 0) { pageNumber = pageNumber; }else { // 余數不為0,除數加1 pageNumber = pageNumber + 1; } } CGFloat width = 0; // 考慮特殊情況(當item的總個數不是self.rowCount * self.itemCountPerRow的整數倍,并且余數小于每行展示的個數的時候) if (pageNumber > 1 && remainder != 0 && remainder < self.itemCountPerRow) { width = self.edgeInsets.left + (pageNumber - 1) * self.itemCountPerRow * (itemWidth + self.columnSpacing) + remainder * itemWidth + (remainder - 1)*self.columnSpacing + self.edgeInsets.right; }else { width = self.edgeInsets.left + pageNumber * self.itemCountPerRow * (itemWidth + self.columnSpacing) - self.columnSpacing + self.edgeInsets.right; } // 只支持水平方向上的滾動 return CGSizeMake(width, 150);}/** 設置每個item的屬性(主要是frame) */- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{ // item的寬高由行列間距和collectionView的內邊距決定 CGFloat itemWidth = (self.collectionView.frame.size.width) / self.itemCountPerRow; CGFloat itemHeight = (self.collectionView.frame.size.height) / self.rowCount; NSInteger item = indexPath.item; // 當前item所在的頁 NSInteger pageNumber = item / (self.rowCount * self.itemCountPerRow); NSInteger x = item % self.itemCountPerRow + pageNumber * self.itemCountPerRow; NSInteger y = item / self.itemCountPerRow - pageNumber * self.rowCount; // 計算出item的坐標 CGFloat itemX = itemWidth * x; CGFloat itemY = itemHeight * y; UICollectionViewLayoutAttributes *attributes = [super layoutAttributesForItemAtIndexPath:indexPath]; // 每個item的frame attributes.frame = CGRectMake(itemX, itemY, itemWidth, itemHeight); return attributes;}/** 返回collectionView視圖中所有視圖的屬性數組 */- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{ return self.attributesArrayM;}#pragma mark - Lazy- (NSMutableArray *)attributesArrayM{ if (!_attributesArrayM) { _attributesArrayM = [NSMutableArray array]; } return _attributesArrayM;}@end

4、自定義cell 和model

model

#import <Foundation/Foundation.h>@interface CollModel : NSObject@property (nonatomic,strong)NSString *imgUrl;@property (nonatomic,strong)NSString *title;@property (nonatomic,strong)NSString *url;@end

cell 自定義

#import 'imageCell.h'// 屏幕比例#define SCREEN_RATE ([UIScreen mainScreen].bounds.size.width/375.0)@interface imageCell()@property (nonatomic, strong) UIImageView *itemIcon;@end@implementation imageCell@synthesize itemModel = _itemModel;- (instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { self.contentView.backgroundColor = [UIColor clearColor]; [self initView]; } return self;}- (void)initView{ _itemIcon = [[UIImageView alloc] init]; [self.contentView addSubview:_itemIcon]; _itemIcon.backgroundColor = [UIColor clearColor]; CGFloat iconWidth = 80 * SCREEN_RATE; _itemIcon.frame = CGRectMake(0, 0, iconWidth, iconWidth); _itemIcon.center = self.contentView.center;}- (CollModel *)itemModel{ return _itemModel;}- (void)setItemModel:(CollModel *)itemModel{ if (!itemModel) { return; } _itemModel = itemModel; [self setCellWithModel:_itemModel];}- (void)setCellWithModel:(CollModel *)itemModel{ [[NSOperationQueue mainQueue] addOperationWithBlock:^{ _itemIcon.image = [UIImage imageNamed:itemModel.url]; }];}

下載:ios uicollectionview橫向滾動

GitHub下載

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

標簽: IOS
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产成人免费在线观看不卡| 精品国产1区二区| 欧美日韩中文字幕一区二区| 久久久国产综合精品女国产盗摄| 日韩国产精品久久| 亚洲视屏一区| 欧美精品一区二区三区蜜桃视频| 国产乱子伦视频一区二区三区 | 欧美午夜在线观看| 亚洲综合一区二区精品导航| 欧美一区二区三区在线播放| 日韩美女视频在线| 国产一区二区三区国产| 91久久香蕉国产日韩欧美9色| 亚洲欧美激情视频在线观看一区二区三区 | 国产一区二区免费看| 麻豆av一区二区三区| 亚洲女爱视频在线| 精品成人久久| 久久精品一级爱片| www.在线成人| 日韩免费视频线观看| 国产成人精品影院| 3atv在线一区二区三区| 精品一区二区三区香蕉蜜桃 | 精品中文av资源站在线观看| 久久亚洲精品欧美| 香港成人在线视频| 久久精品人人| 亚洲成人第一页| 国产一区二区三区免费不卡| 亚洲人成网站影音先锋播放| 国内精品久久久久久久97牛牛 | 成人免费视频视频| 91精品国产91久久久久久最新毛片 | 精品国产亚洲在线| 高清久久久久久| 欧美一区二区三区四区五区 | 亚洲另类自拍| 亚洲欧美成人一区二区三区| 在线综合亚洲| 亚洲成av人**亚洲成av**| 久久青草久久| 蜜臀久久久久久久| 在线观看91精品国产麻豆| 成人毛片视频在线观看| 日本一区二区免费在线观看视频| 在线观看视频免费一区二区三区| 一区二区三区精品| 色天天综合色天天久久| 奇米色777欧美一区二区| 欧美色视频在线观看| 国产成人精品亚洲日本在线桃色 | 成人激情动漫在线观看| 国产日韩成人精品| 亚洲巨乳在线| 免费在线视频一区| 欧美成人一级视频| 黄色日韩在线| 亚洲国产日韩a在线播放性色| 在线观看亚洲一区| 日本不卡一二三| 欧美日韩高清在线播放| 在线一区二区三区| 蜜臂av日日欢夜夜爽一区| 欧美日韩亚洲高清一区二区| 久久97超碰国产精品超碰| 在线电影院国产精品| 成人av免费在线观看| 精品剧情在线观看| 亚洲欧洲另类| 亚洲午夜精品网| 久久婷婷丁香| 久久99最新地址| 91精品国产综合久久久久| 国产精品香蕉一区二区三区| 欧美色手机在线观看| 成人自拍视频在线| 久久久久国产精品厨房| 欧美69视频| 亚洲精品精品亚洲| 免费欧美日韩| 久久精品久久99精品久久| 久久深夜福利| 国产一区二区三区美女| 日韩欧美成人一区| 欧美激情第六页| 一级日本不卡的影视| 蜜桃久久av| 激情成人午夜视频| 欧美精品一区二区三区在线| 国产精品videosex极品| 亚洲视频 欧洲视频| 色拍拍在线精品视频8848| 国产美女视频一区| 日本一区二区视频在线观看| 亚洲精选国产| 日韩av电影免费观看高清完整版 | 在线国产电影不卡| 欧美国产精品一区二区| 老鸭窝毛片一区二区三区| 青青草国产精品亚洲专区无| 国产欧美日韩卡一| 国产精品一区视频网站| 成人av资源在线| 日韩免费视频一区二区| 日韩av中文字幕一区二区| 亚洲第一在线综合网站| 久久一日本道色综合| 欧美日韩专区在线| 色欧美片视频在线观看在线视频| 欧美日韩国产另类不卡| 国产精品不卡视频| 99精品视频一区| 欧美日韩一区二区三区在线| 日韩欧美高清在线| 一级女性全黄久久生活片免费| 久久久精品黄色| 精品久久久久久久久久久久久久久 | 久久99热99| 精品成a人在线观看| 国产一区二区三区奇米久涩| 国产麻豆精品一区二区| 国产精品国产三级国产有无不卡| 久久福利电影| 91无套直看片红桃| 日韩黄色小视频| 国产欧美一区二区精品婷婷| 国产精品资源| 国产精品九九| 国内精品久久久久影院色| 国产精品美女久久久久av爽李琼| 欧美亚洲综合一区| 亚洲图片在线| 极品少妇xxxx偷拍精品少妇| 国产精品污www在线观看| 欧美在线看片a免费观看| 欧美破处大片在线视频| 久久久91精品国产一区二区精品| 老鸭窝亚洲一区二区三区| 99久久久国产精品免费蜜臀| 视频一区视频二区中文| 中文字幕av资源一区| 欧美夫妻性生活| 亚洲免费久久| 91丝袜美女网| 麻豆精品在线播放| 亚洲欧美视频在线观看视频| 欧美日韩中文另类| 99在线精品视频在线观看| 成人午夜短视频| 日韩成人免费电影| 国产精品久久久久婷婷| 777奇米四色成人影色区| 中文日韩欧美| 97久久人人超碰| 久久成人免费日本黄色| 亚洲视频一区在线| 欧美一级片在线| 欧美日韩国产高清一区二区三区| av不卡在线看| 欧美在线首页| 国产精品自拍毛片| 日本va欧美va欧美va精品| 中文字幕日韩一区二区| 精品国产凹凸成av人网站| 久久亚洲高清| 亚洲精品色图| 成人国产精品免费网站| 国产a区久久久| 精品国产一区二区三区久久影院 | 国产一区美女在线| 三级亚洲高清视频| 中文字幕综合网| 国产网站一区二区三区| 欧美日韩国产bt| 色诱视频网站一区| 国产午夜精品一区二区三区欧美| 成人黄动漫网站免费app| 日韩精品电影在线| 一区在线中文字幕| 久久精品夜色噜噜亚洲aⅴ| 欧美一个色资源| 欧美最猛性xxxxx直播| 免费视频一区| 99精品国产在热久久下载| 欧美一区二区三区四区夜夜大片| 成人影视亚洲图片在线| 日韩电影网1区2区| 成人免费在线观看入口| 久久久综合九色合综国产精品| 欧美一级欧美一级在线播放| 欧美性xxxxxxxx| 欧美性一二三区| 日本国产一区二区| 久久一区精品| 先锋a资源在线看亚洲| 亚洲三级观看| 精品69视频一区二区三区Q| 97久久超碰精品国产|