iOS开发UI篇-实现tableView的层级显示
进来要实现一个tableView 的cell层级显示,网上找的思路都各不相同.下面说一下我的实现思路.
根据根标题存储cell的展开状态,添加到字典中.
话不多说,直接上代码.
#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width @interface CellTreesController ()<UITableViewDelegate,UITableViewDataSource> @property(nonatomic,strong)UITableView *MyTableView; @property(nonatomic,strong)NSMutableArray *dataArray;//存放标题 @property(nonatomic,strong)NSMutableDictionary *boolDcitionary;//存放对应分区section是否展开 @end @implementation CellTreesController - (void)viewDidLoad {
[super viewDidLoad]; _MyTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) style:UITableViewStylePlain];
_MyTableView.dataSource = self;
_MyTableView.delegate = self;
_MyTableView.tableFooterView = [UIView new];
[self.view addSubview:_MyTableView]; //组头数据
for (int i = 0; i < 20; i ++) { NSString *titleString = [NSString stringWithFormat:@"第%d组",i + 1];
[self.dataArray addObject:titleString];
} // Do any additional setup after loading the view.
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} #pragma mark - dalegate dataSource //区头视图高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ return 44;
} //区头视图
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
UIView *headerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 44)];
UILabel *lable = [[UILabel alloc]initWithFrame:CGRectMake(20, 7, 150, 30)];
lable.text = self.dataArray[section];
lable.textColor = [UIColor orangeColor];
headerView.tag = 1000 + section;
//添加手势->控制cell的展开
[headerView addGestureRecognizer:[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(clickView:)]];
[headerView addSubview:lable];
return headerView;
} //section
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 20;
} //row
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ NSString *clickTag = [NSString stringWithFormat:@"%ld",section + 1000]; if ([self.boolDcitionary[clickTag] integerValue] == 1) {
return 6; }else{ return 0;
}
} //cell
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identifier = @"myTableViewCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
} cell.textLabel.text = [NSString stringWithFormat:@"第%ld行",indexPath.row + 1]; return cell; } #pragma mark - tap手势点击事件 - (void)clickView:(UITapGestureRecognizer *)action{ NSString *clickTag = [NSString stringWithFormat:@"%ld",action.view.tag]; //第二个cell展开时仍然保持前一个cell的展开状态
//状态为0 代表关闭
if ([self.boolDcitionary[clickTag] integerValue] == 0) { [self.boolDcitionary setValue:@(1) forKey:clickTag];
}else{
//状态为1 代表展开
[self.boolDcitionary setValue:@(0) forKey:clickTag];
} // //第二个cell展开时自动关闭之前展开的cell
// //状态为0 代表关闭
// if ([self.boolDcitionary[clickTag] integerValue] == 0) {
//
// for (int i = 1000; i < (1000 + 20); i++) {
// NSString *clickStr = [NSString stringWithFormat:@"%d",i];
// if ([clickStr isEqualToString:clickTag]) {
//
// [self.boolDcitionary setValue:@(1) forKey:clickStr];
//
// }else{
//
// [self.boolDcitionary setValue:@(0) forKey:clickStr];
// }
//
// }
// }else{
// //状态为1 代表展开
// [self.boolDcitionary setValue:@(0) forKey:clickTag];
// } //刷新tableView(不可少)
[_MyTableView reloadData]; } #pragma mark - 懒加载
-(NSMutableDictionary *)boolDcitionary{
if (!_boolDcitionary) {
_boolDcitionary = [NSMutableDictionary dictionary];
}
return _boolDcitionary;
} - (NSMutableArray *)dataArray{
if (!_dataArray) {
_dataArray = [NSMutableArray array];
}
return _dataArray;
}
那么又有人问了,我的cell虽然展开了,但是都是直上直下得展开,还没有一点动画效果.下面给大家介绍一下cell展开的动画效果实现.
实现下面UITableViewDelegate的方法
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
写一个UITableViewCell的简单动画效果.
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
CATransform3D rotation;
rotation = CATransform3DMakeRotation( (90.0*M_PI)/180, 0.0, 0.7, 0.4);
rotation.m34 = 1.0/ -600;
cell.layer.shadowColor = [[UIColor blackColor]CGColor];
cell.layer.shadowOffset = CGSizeMake(10, 10);
cell.alpha = 0;
cell.layer.transform = rotation;
[UIView beginAnimations:@"rotation" context:NULL];
[UIView setAnimationDuration:0.8];
cell.layer.transform = CATransform3DIdentity;
cell.alpha = 1;
cell.layer.shadowOffset = CGSizeMake(0, 0);
[UIView commitAnimations];
}
iOS开发UI篇-实现tableView的层级显示的更多相关文章
- IOS开发UI篇之tableView 的用法详解
1.我们知道tableView是IOS中的高级视图,其继承与ScrollView,故我们知道他有具有ScrollView的所有功能.而且还扩展了许多.当然在这里就不一一介绍了. 2.tableView ...
- ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布 ...
- iOS开发UI篇—UITableview控件简单介绍
iOS开发UI篇—UITableview控件简单介绍 一.基本介绍 在众多移动应⽤用中,能看到各式各样的表格数据 . 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView,UIT ...
- iOS开发UI篇—UITableview控件基本使用
iOS开发UI篇—UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) #import <Foundation/Foundation.h> ...
- iOS开发UI篇—UITableviewcell的性能优化和缓存机制
iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...
- iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序
iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: // // YYcar ...
- iOS开发UI篇—实现UItableview控件数据刷新
iOS开发UI篇—实现UItableview控件数据刷新 一.项目文件结构和plist文件 二.实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运 ...
- iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局
iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局 一.项目文件结构和plist文件 二.实现效果 三.代码示例 1.没有使用配套的类,而是直接使用xib文 ...
- iOS开发UI篇—UITableview控件使用小结
iOS开发UI篇—UITableview控件使用小结 一.UITableview的使用步骤 UITableview的使用就只有简单的三个步骤: 1.告诉一共有多少组数据 方法:- (NSInteger ...
随机推荐
- 【HDOJ】2155 小黑的镇魂曲
线段树+SPFA最短路可以过.或者DP也能过.需要注意的是xl的范围是错的,测试用例中xl可能为0,他妈的,因为这个一直莫名其妙的wa.1. spfa建图增加一倍的点即可(讨论左端点和右端点). /* ...
- BZOJ_1011_[HNOI2008]_遥远的行星_(近似)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1011 \(n\)个行星,第\(i\)颗行星的质量为\(m_i\),给出一个很小的常数\(A\) ...
- MFC CVIew关闭时崩溃
记得看视频的时候老师说过 创建CView的时候,也就是创建视图的时候,不要使用 Cview m_view;这种方式 而是使用Cview * pView=new Cview() ...
- apache开源项目-- NiFi
Apache NiFi 是一个易于使用.功能强大而且可靠的数据处理和分发系统.Apache NiFi 是为数据流设计.它支持高度可配置的指示图的数据路由.转换和系统中介逻辑. 架构: 集群管理器: 主 ...
- XCode中Architecturs配置及常见问题
http://lanvige.github.io/2014/03/19/architecturs-in-xcode/ XCode 5.1升级后因arm64和CocoaPods的原因,痛了一天,终于解决 ...
- 从微信推送看Android Service的创建和销毁
启动服务是有两组参数影响服务的状态. 1.在onStartCommand(Intent intent, int flags, int startId) 接口中返回值,例如 START_STICKY; ...
- Mesos编译步骤及部署注意事项(Ubuntu)
注意事项: 编译过程如果有错误提示少什么库,则相应的安装库即可在编译中出现 g++: internal compiler error: Killed (program cc1plus)的错误是因为内存 ...
- ios之UI中自定义cell
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- UVa1328 - Period(KMP找最短循环节)
题目大意 给定一个长度为n的字符串,求它的每个前缀的最短循环节 题解 白书例题~~~ "错位部分"长度为i-f[i], 如果这个前i个字符能够组成一个周期串,那么"错位& ...
- UVa10635 - Prince and Princess(LCS转LIS)
题目大意 有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n^2之间的整数.两个序列的第一个元素均为1.求出A和B的最长公共子序列长度. 题解 这个是大白书上的例题,不过 ...