iOS 美丽说瀑布流界面纯AutoLayout光速布局
最近在Github上看到三个库,分别是
GSKStretchyHeaderView,CHTCollectionViewWaterfallLayout ,JZNavigationExtension,
其中第一个是给CollectionView添加可动画的头部,添加方式和内容非常丰富,第二个是
瀑布流布局,第三个是UINavigationController的导航栏扩展。这三个东西厉害了啊,结
合起来咱们写个Demo,纯AutoLayout,效率非常高
(小弟搜集的好用的第三方库传送门:点击打开链接)
废话不多说,直接上车,无需投币,请自觉拉紧扶手,几分钟就搞定一个界面
主要知识点如下
1.瀑布流式的实现
2.MJExtension Json转Model 详情点击打开
3.UICollectionView的拉大头部实现
4.UICollectionReusableView的head嵌入UICollectionView
5.StatusBar的颜色切换,这个这里不介绍了 详情点击打开
6.父视图的Alpha如何不影响子视图
1.首先,在我们新建的工程里面用cocopods导入需要的库,然后创建控制器,由于全是IB实现的,所以图很多,布
局的代码很少
如下图,我们在VC里面拖一个CollectionView进来,约束好让他充满屏幕,记住,我们的UICollectionViewLayout不在用了,换成图上的那个,要选择Custom进行替换
替换之后需要给上对应的属性代码,记得先把这个Laytou拖出去,一样Ctrl +鼠标拖出去就行了
@property (weak,nonatomic) IBOutletCHTCollectionViewWaterfallLayout *CHTLayout;
self.CHTLayout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10); // sectionHeader高度 self.CHTLayout.headerHeight = 80; // sectionFooterHeight
// self.CHTLayout.footerHeight = 10; // 间距 self.CHTLayout.minimumColumnSpacing = 10; self.CHTLayout.minimumInteritemSpacing = 10; self.CHTLayout.minimumContentHeight = 220; // 多少列 self.CHTLayout.columnCount = 2;
2.然后看图,我们这里有两个CollectionView,把对应的cell先用IB抽出来
注册Cell,注意这里注册头的时候已经换了Layout了,千万别写错了
[self.collectionView registerNib:[UINib nibWithNibName:identyfy bundle:nil] forCellWithReuseIdentifier:identyfy];[self.collectionView registerNib:[UINib nibWithNibName:identyfy1 bundle:nil]forCellWithReuseIdentifier:identyfy1];[self.collectionView registerNib:[UINib nibWithNibName:reusehead bundle:nil] forSupplementaryViewOfKind:CHTCollectionElementKindSectionHeader withReuseIdentifier:reusehead];
3.接着,我们已经把UI的控件都准备好了,调用就行了,现在我们请求数据组装模型
- (void)MKJGETRequest:(NSString *)requestURL page:(NSInteger)page parameters:(NSDictionary *)parameters succeed:(completionBlock)succeedBlock failure:(completionBlock)failureBlock
{ // AF3.0的方法 AFHTTPSessionManager *man = [AFHTTPSessionManager manager]; man.responseSerializer = [AFJSONResponseSerializer serializer]; man.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html",@"text/json",@"text/javascript", nil nil]; [man POST:requestURL parameters:@{ @"category_id" : @"48", @"app" : @"higo", @"category_source" : @"1", @"client_id" : @"1", @"cver" : @"5.1.0", @"device_id" : @"h_13aa73608eac4f13a3a37987678ed986", @"device_model" : @"iPhone 6S Plus", @"device_token" : @"c8b128363664e6feda0bac9ae1931c53392994308e455ee1d481dc1108883402", @"device_version" : @"9.3.2", @"idfa" : @"2FF88C7F-0756-427B-A2A3-B7FB449D7043", @"open_udid" : @"cdec8d86d9b086f705183232c1f607a106fa42b3", @"p" : [NSString stringWithFormat:@"%ld",page], @"package_type" : @"1", @"qudaoid" : @"10000", @"uuid" : @"486b8b8fd7b0b02d3852841bcdf6bba6", @"ratio" : @"1242*2208", @"size" : @"30", @"ver" : @"0.8", @"via" : @"iphone" } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // MJExtension的方法 [HigoList mj_setupObjectClassInArray:^NSDictionary *{ return @{@"category_list" : @"CategoryModel",@"goods_list":@"GoodsModel"}; }]; // 一句话变身为Model HigoList *list = [HigoList mj_objectWithKeyValues:[responseObject valueForKey:@"data"]]; // 回调 if (succeedBlock) { succeedBlock(nil,list); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (failureBlock) { failureBlock(error,nil); } }];
}
4.之后,我们在VC里面实现所有的代理方法
关键代理方法一,该方法加载Cell的大小,这里根据
self.CHTLayout.columnCount =2;这个方法来进行操作,首先如果这个第三方Layout的column是2,那么宽度就屏
幕的宽度除以2,如果是3就是除以3,所以这里CGSIZE的宽度没那没必要,他要的其实是一个宽度高度比例(注意和原生的已经不同了),例如CGSize(1,0.6)代表,宽度是屏幕的一般,高度是宽度的0.6倍
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{ if (indexPath.item == 0) { return CGSizeMake(1,0.6); } if (self.CHTLayout.columnCount == 2) { return CGSizeMake(1,1.4); } else if (self.CHTLayout.columnCount == 3) { if (indexPath.item % 3 == 1) { return CGSizeMake(1, 1.8); } else { return CGSizeMake(1, 1.7); } } else { return CGSizeMake(1, 2); }
}
关键代理方法二,给SectionHeader里面的collectionView加载数据
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{ if ([kind isEqualToString:CHTCollectionElementKindSectionHeader]) { HeadCollectionReusableView *header = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:reusehead forIndexPath:indexPath]; // 数组穿进去 header.headImages = self.headImages; // 刷新里面的CollectionView控件 [header.headCollection reloadData]; return header; } return nil;
}
5.其次,我们给CollectionView加一个头部,这个头想要什么效果都可以,我选择了下拉放大
记得创建一个继承与GSKStretchyHeaderView的View
@interface GSKNibStretchyHeaderView :GSKStretchyHeaderView
// GSK加载头部放大视图
- (void)configGSKHeader
{ self.isRefreshedData = YES; // 需要不同效果请看源码,这里用IB加载的话就是能加载出Demo效果 NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"GSKNibStretchyHeaderView" owner:self options:nil]; self.GSKHeadView1 = nibViews.firstObject; self.GSKHeadView1.gskMaskView.alpha = 0.3; self.GSKHeadView1.maximumContentHeight = self.headerViewHeight;
}
6.最后,来一组滚动时候让导航栏渐变
#import "JZNavigationExtension.h"然后调用self.jz_navigationBarBackgroundAlpha = alpha;就能改变导航栏的透明度[selfsetNeedsStatusBarAppearanceUpdate];该方法是改变StatusBar的颜色的,上面给了链接,可以进去瞧瞧
#pragma mark - scrollView滚动
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{CGFloat y = scrollView.contentOffset.y;NSLog(@"%f",y);if (y >-self.headerViewHeight+1){CGFloat deleta = self.headerViewHeight - 64;CGFloat alpha = (self.headerViewHeight+y)/deleta;self.jz_navigationBarBackgroundAlpha = alpha;if (alpha>0.6){[self.backButton setImage:self.backItemImage2 forState:UIControlStateNormal];[self.backButton setImage:self.backItemHightLightImage2 forState:UIControlStateHighlighted];self.statusBarStyle = UIStatusBarStyleDefault;self.navigationItem.titleView.alpha = alpha;self.titleViewAlpha = self.navigationItem.titleView.alpha;self.title = @"呵呵";}else{self.statusBarStyle = UIStatusBarStyleLightContent;self.navigationItem.titleView.alpha = 0;self.titleViewAlpha = 0;}[self setNeedsStatusBarAppearanceUpdate];}else{self.title = @"";self.navigationItem.titleView.alpha = 0;self.titleViewAlpha = 0;self.jz_navigationBarBackgroundAlpha = 0;[self.backButton setImage:self.backItemImage1 forState:UIControlStateNormal];[self.backButton setImage:self.backItemHightLightImage1 forState:UIControlStateHighlighted];self.statusBarStyle = UIStatusBarStyleLightContent;[self setNeedsStatusBarAppearanceUpdate];}}
Tips:父视图的Alpha如何不影响子视图
[[UIColorredColor] colorWithAlphaComponent:0.7];
用该方法给需要控件的BackgroundColor赋值就不会影响子视图了
差不多介绍到这里,一个简单的Demo就这样完了,用不了几分钟,需要看详情的请戳
Demo地址:https://github.com/DeftMKJ/Higo
iOS 美丽说瀑布流界面纯AutoLayout光速布局相关推荐
- iOS基础UI瀑布流界面简单搭建
ios UI基础瀑布流 顾名思义是将界面以瀑布流水般的展现出来,使用瀑布流,首先对数据进行懒加载,传入数据后,使用UIcollectionView控件在main.storyboard里进行简单的布局 ...
- html 瀑布流样式,纯css如何实现瀑布流?css实现瀑布流的两种方式
瀑布流的布局感觉还是蛮不错的,所以本篇文章就给大家来分享一下css实现瀑布流布局的两种方法,通过multi-column多列布局实现瀑布流和flex布局实现瀑布流. 1.multi-column多列布 ...
- ios开发瀑布流框架的封装
一:瀑布流框架封装的实现思路:此瀑布流框架的封装仿照tableView的底层实现,1:每个cell的frame的设置都是找出每列的最大y值,比较每列的最大y值,将下一个cell放在最大y值最小的那一列 ...
- vuejs和webpack项目(VueComponent)初尝试——瀑布流组件
碎碎念: 好久不见,最近自己有些懈怠没更过多少博,主要原因之一是对自己学习方式的一些思考,翻看之前的博客多是记录学习笔记这反映出了自己对于前端还停留在学习-复习知识点的阶段压根没多少实践经验 ...
- 不固定图片宽高瀑布流_APP设计学习:瀑布流式的产品UI设计
看到好的APP产品UI设计,真是忍不住想要停留几秒,慢慢来欣赏.今天学堂君收集了近期不错的优质的APP设计作品,看起来极舒服的UI界面,分享给大家.这一期的重点学习:在APP界面设计当中,如何应用瀑布 ...
- 在 JQuery Mobile 中实现瀑布流图库布局
先来看在Windows系统的1080P显示器中显示的效果: 这个整合方式几乎没有现存的实例,是自己总结出来的方法,在此记录下来. 首先访问Masonry官网下载masonry.pkgd.min.js: ...
- JavaScript——原生js实现瀑布流
瀑布流介绍及实现原理: 瀑布流是一种页面布局,页面上也有多等宽的块(块就页面内容),每一块都是绝对定位(absolute),每个块排列的方式如下:寻找现在高度最小的列,把该块定位到该列下方.需要知道, ...
- 【iOS开发每日小笔记(二)】gitHub上的开源“瀑布流”使用心得
这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己 ...
- iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流
在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,C ...
最新文章
- opencv(2)- 处理像素值
- JavaFX FXML场景编辑器使用示例
- Android客户端打包方案分享
- 华为S5700交换机开启telnet远程登陆配置(推荐)
- redis 3.0 java 工具包_redis分布式锁工具包,提供纯Java方式调用
- 软件测试功底技术——编程语言
- Zemax仿真中像质评价及方法
- Egret引擎游戏内存优化指南
- STM32F103+RTT从零开始(二)——RTT系统中点亮LED
- Windows生成SSH密钥
- 物联网蓝牙芯片的选型
- 苹果cms详细安装方法
- 报错及解决:Kernel does not exist: 96b59d42-d81e-471c-8ef9-63a61a963a16
- 智能抠图工具 TeoreX PhotoScissors 5.0 汉化
- facebook-pop 概述
- 自适应控制中自适应参数估计与系统辨识的区别
- Gradle plugin requires a newer IDE able to request IDE model level 3.
- c语言题库及答案免费下载,C语言题库(含答案)
- 贵州大学matlab校园版,通知 | MATLAB(校园版) 即将发布,敬请关注!
- 根据城市名称检索城市ID,以及省市县(LitePal+RxJava+Retrofit)
热门文章
- html水平翻转效果,CSS3样式实现水平和垂直翻转
- ant design pro vue 动态路由 流程详解
- Licode入门学习:Licode服务与启动过程分析
- 激光雷达和相机的联合标定(Camera-LiDAR Calibration)之Autoware
- 逆用“端点效应”,成就放缩之道——针对超越函数的双值拟合放缩
- 数据库模糊查询+连接查询
- 初学Verilog语言基础笔记整理(实例点灯代码分析)持续更新~
- 古代美女偷情之后的12种结局
- Node-express项目--个人简历:搭建posts接口并实现评论、点赞以及相关功能
- 投影机在笔记本电脑上切换视频的快捷键列表