UICollectionView二级树展开
公司项目是社区类的,上周就下载了些社区类APP看了下,发现小区无忧首页的顶部蛮好玩,就试着做了一下,现在先把UICollectionView的二级树展开功能分享一下 .
1.效果图

2.创建子CollectionView
// // DeatilView.h // Spread // // Created by City--Online on 15/10/30. // Copyright © 2015年 City--Online. All rights reserved. // #import <UIKit/UIKit.h> typedef void(^DetailIndexPathBlock) (NSIndexPath *indexPath); @interface DetailView : UIView @property (nonatomic,copy) DetailIndexPathBlock detailIndexPathBlock; - (instancetype)initWithFrame:(CGRect)frame withTitleArray:(NSArray *)titleArray; @end
//
// DeatilView.m
// Spread
//
// Created by City--Online on 15/10/30.
// Copyright © 2015年 City--Online. All rights reserved.
//
#import "DetailView.h"
;
static const float rowHeight=30.0;
//static const int rows=2;
@interface DetailView ()<UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
@property (nonatomic,strong) UICollectionView *collectionView;
@property (nonatomic,strong) NSArray *titleArray;
@end
@implementation DetailView
- (instancetype)initWithFrame:(CGRect)frame withTitleArray:(NSArray *)titleArray
{
_titleArray=titleArray;
return [self initWithFrame:frame];
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
UICollectionViewFlowLayout *collectionViewFlowLayout=[[UICollectionViewFlowLayout alloc]init];
collectionViewFlowLayout.minimumInteritemSpacing=0.0;
collectionViewFlowLayout.minimumLineSpacing=0.0;
collectionViewFlowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
collectionViewFlowLayout.sectionInset = UIEdgeInsetsMake(, 0.0);
float columuWidth=self.bounds.size.width/columns;
collectionViewFlowLayout.itemSize=CGSizeMake(columuWidth, rowHeight);
collectionViewFlowLayout.estimatedItemSize=CGSizeMake(columuWidth, rowHeight);
collectionViewFlowLayout.scrollDirection=UICollectionViewScrollDirectionVertical;
collectionViewFlowLayout.headerReferenceSize=CGSizeMake(, );
collectionViewFlowLayout.footerReferenceSize=CGSizeMake(, );
_collectionView=[[UICollectionView alloc]initWithFrame:self.bounds collectionViewLayout:collectionViewFlowLayout];
_collectionView.backgroundColor=[UIColor whiteColor];
_collectionView.delegate=self;
_collectionView.dataSource=self;
_collectionView.allowsSelection=YES;
// _collectionView.allowsMultipleSelection=YES;
[_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
[self addSubview:_collectionView];
}
return self;
}
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return _titleArray.count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell =[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
cell.backgroundColor = [UIColor colorWithRed:arc4random()%/ / / ];
return cell;
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
if (self.detailIndexPathBlock != nil) {
self.detailIndexPathBlock(indexPath);
}
}
@end
3.主视图
// // MainView.h // Spread // // Created by City--Online on 15/10/30. // Copyright © 2015年 City--Online. All rights reserved. // #import <UIKit/UIKit.h> @interface MainView : UIView - (instancetype)initWithFrame:(CGRect)frame withTitleArray:(NSArray *)mainArray; @end
//
// MainView.m
// Spread
//
// Created by City--Online on 15/10/30.
// Copyright © 2015年 City--Online. All rights reserved.
//
#import "MainView.h"
#import "DetailView.h"
;
@interface MainView ()<UICollectionViewDataSource,UIBarPositioningDelegate,UICollectionViewDelegateFlowLayout>
@property (nonatomic,strong) UICollectionView *collectionView;
@property (nonatomic,strong) NSArray *mainArray;
@property (nonatomic,strong) NSMutableArray *detailArray;
@property (nonatomic,strong) NSIndexPath *selectIndexPath;
@property (nonatomic,strong) DetailView *detailView;
@property (nonatomic,assign) bool *IsSpread;
@end
@implementation MainView
- (instancetype)initWithFrame:(CGRect)frame withTitleArray:(NSArray *)mainArray
{
_mainArray=mainArray;
_selectIndexPath=nil;
return [self initWithFrame:frame];
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
UICollectionViewFlowLayout *collectionViewFlowLayout=[[UICollectionViewFlowLayout alloc]init];
collectionViewFlowLayout.minimumInteritemSpacing=1.0;
collectionViewFlowLayout.minimumLineSpacing=0.0;
collectionViewFlowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
collectionViewFlowLayout.sectionInset = UIEdgeInsetsMake(, 0.0);
)/columns;
collectionViewFlowLayout.itemSize=CGSizeMake(columuWidth, columuWidth);
collectionViewFlowLayout.estimatedItemSize=CGSizeMake(columuWidth, columuWidth);
collectionViewFlowLayout.scrollDirection=UICollectionViewScrollDirectionVertical;
collectionViewFlowLayout.headerReferenceSize=CGSizeMake(, );
collectionViewFlowLayout.footerReferenceSize=CGSizeMake(, );
_collectionView=[[UICollectionView alloc] initWithFrame:self.bounds collectionViewLayout:collectionViewFlowLayout];
_collectionView.backgroundColor=[UIColor whiteColor];
_collectionView.delegate=self;
_collectionView.dataSource=self;
_collectionView.allowsSelection=YES;
[_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
[_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"footer"];
[self addSubview:_collectionView];
}
return self;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return columns;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell =[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
cell.backgroundColor=indexPath.section%? [UIColor redColor]:[UIColor yellowColor];
if (indexPath.section*columns+indexPath.row>_mainArray.count) {
cell.backgroundColor=[UIColor clearColor];
}
return cell;
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
if (_selectIndexPath!=indexPath&&_selectIndexPath!=nil) {
_IsSpread=YES;
}
else
{
_IsSpread=!_IsSpread;
}
if (!_IsSpread) {
//改变主CollectionView视图Frame和子CollectionView的Frame
self.frame=CGRectMake(, , self.bounds.size.width, self.bounds.size.width);
}
else
{
self.frame = CGRectMake(, , self.bounds.size.width, self.bounds.size.width+(()/)*30.0);
}
_collectionView.frame = self.frame;
_selectIndexPath=indexPath;
//改变数据源
_detailArray=[(@[@"AAA",@"BBB",@"CCC",@"DDD",@"EEE"]) mutableCopy];
[_collectionView reloadData];
}
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
)/;
}
//针对每个分区的页眉和页脚, 返回对应的视图对象, 重用的
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
UICollectionReusableView *footerView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"footer" forIndexPath:indexPath];
//将第二个视图控制器添加到区尾上
if (_detailView!=nil) {
[_detailView removeFromSuperview];
_detailView=nil;
}
_detailView =[[DetailView alloc] initWithFrame:CGRectMake(, , self.bounds.size.width, ((+)/)*30.0) withTitleArray:_detailArray];
_detailView.detailIndexPathBlock=^(NSIndexPath *indexPath)
{
NSLog(@"%@",indexPath);
};
[footerView addSubview:_detailView];
return footerView;
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section
{
if (section==_selectIndexPath.section&&_IsSpread) {
)/)*30.0) ;
}
else
{
return CGSizeZero;
}
}
@end
4.调用
//
// ViewController.m
// Spread
//
// Created by City--Online on 15/10/30.
// Copyright © 2015年 City--Online. All rights reserved.
//
#import "ViewController.h"
#import "MainView.h"
#import "DetailView.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
MainView *mainView=[[MainView alloc]initWithFrame:CGRectMake(, , self.view.bounds.size.width, self.view.bounds.size.width) withTitleArray:@["]];
[self.view addSubview:mainView];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
5.结果图



今天又添加了ScrollView分页 demo地址:https://github.com/ywcui/Spread
UICollectionView二级树展开的更多相关文章
- 下拉的DIV+CSS+JS二级树型菜单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ZENCART 二级 分类 展开
zencart首页默认的是只显示一级分类,很多做仿牌外贸的朋友觉得只显示一级分类不好看,也不利于产品展示.怎么让zencart首页显示二级目录?下面分享给大家: 打开文件’includes/class ...
- js展开一颗树
Tree View 指令不支持 树结构数据源, 只支持单层数组.(也许是我没发现,人家可以设置) .我只能把树展开,变成单层数组.然后还要记录已经递归到第一层了.比如这样. <!doctype ...
- zencart侧边导航点击一级目录展开二级目录
[小 大] 2013-09-17 00:20 来源: 未知 作者:wtozz_admin 我要投稿 zencart侧边导航点击一级目录展开二级目录 zen cart Categories默认的是只显示 ...
- 【zTree】zTree展开树节点
今天在做zTree树的时候想着将第一级tree展开,于是利用下面方法: /** * 展开树节点的第一层 */ function openFirstTreenode(){ // 获取树对象 var tr ...
- 原创的基于HTML/CSS/JavaScript的层级目录树
之前参加过一些基于HTML/CSS/JavaScript的项目,当在页面中需要生成一颗目录树时,总是首先想着网上有没有现成的生成树的源代码,比如dtree.zthee,或者使用一些javascript ...
- 步步为营103-ZTree 二级联动
1:添加引用 <%--流程类别多选--引用js和css文件--开始--%> <link rel="stylesheet" href="../css/zT ...
- python 全栈开发,Day109(客户管理之动态"二级"菜单)
昨日内容回顾 1. 权限有几张表? 2. 简述权限流程? 3. 为什么要把权限放入session? 4. 静态文件和模块文件 5. 相关技术点 - orm查询 - 去空 - 去重 - 中间件 - in ...
- UICollectionView 常用操作
1 iOS开发 - UICollectionView点击展开收起
随机推荐
- JS控制输入框,输入正确的价格
在HTML中,验证输入内容的正确性是提高用户体验的一方面,同时也是初步保证了数据的来源的正确性. 下面是一个常用的控制输入正确的价格的JS代码 function clearNoNum(obj) { o ...
- Volo.Abp.EntityFrameworkCore.MySQL 使用
创建新项目 打开 https://cn.abp.io/Templates ,任意选择一个项目类型,然后创建项目,我这里创建了一个Web Api 解压项目,还原Nuget,项目目录如下: 首先我们来查看 ...
- iOS 添加 Watch OS 1 应用后无法运行 An error was encountered while running (Domain = LaunchServicesError, Code = 0)
在 iOS 应用基础上我添加了一个 Watch OS 2 应用,运行良好.又加了一个 Watch OS 1 应用,然后就所有 Target 都不能运行了. 运行时说 An error was enco ...
- http协议与https协议的区别
1.前言 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可 ...
- java学习笔记—校验码的实现(15)
校验码的出现主要的任务是解决表单的重复提交问题. public void doGet(HttpServletRequest request, HttpServletResponse response) ...
- “全栈2019”Java第一百一十一章:内部类可以被覆盖吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第八十九章:接口中能定义内部类吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 洛谷P1742 最小圆覆盖(计算几何)
题面 传送门 题解 之前只是在抄题解--这篇才算是真正自己想的吧-- 首先我们把输入序列给\(random\)一下防止出题人好心送你一个毒瘤序列 我们设\(r\)为当前最大半径,\(o\)为此时对应圆 ...
- Elasticsearch5.4 删除type
首先要说明的是现在的Elasticsearch已经不支持删除一个type了,所以使用delete命令想要尝试删除一个type的时候会出现如下错误,如果存在一个名为edemo的index和tets的ty ...
- Security-OAuth2.0 密码模式之服务端实现
第一步:配置数据库 ,固定创建三张表 ,OAuth2 框架需要默认使用这三张表 我使用的时Mysql,工具为navcat CREATE TABLE `oauth_access_token` ( `to ...