点击单个cell高度变化的动画效果
2015-09-19 10:07
183 查看
效果
![](http://images2015.cnblogs.com/blog/607542/201509/607542-20150918232422461-1989131897.gif)
说明
1. 点击单个cell的时候,其展开与缩放动画实现起来是很麻烦的,做过相关需求的朋友一定知道其中的坑
2. 本例子只是提供了一个解决方案,为了简化操作,将cell高度封装到了Model当中
源码
https://github.com/YouXianMing/TableViewTapAnimation
细节
![](http://images2015.cnblogs.com/blog/607542/201509/607542-20150918232422461-1989131897.gif)
说明
1. 点击单个cell的时候,其展开与缩放动画实现起来是很麻烦的,做过相关需求的朋友一定知道其中的坑
2. 本例子只是提供了一个解决方案,为了简化操作,将cell高度封装到了Model当中
源码
https://github.com/YouXianMing/TableViewTapAnimation
// // Model.h // TableViewTapAnimation // // Created by YouXianMing on 15/9/18. // Copyright © 2015年 YouXianMing. All rights reserved. // #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface Model : NSObject @property (nonatomic) CGFloat normalHeight; @property (nonatomic) CGFloat expendHeight; @property (nonatomic) BOOL expend; + (instancetype)ModelWithNormalHeight:(CGFloat)normalHeight expendHeight:(CGFloat)expendHeight expend:(BOOL)expend; @end
// // Model.m // TableViewTapAnimation // // Created by YouXianMing on 15/9/18. // Copyright © 2015年 YouXianMing. All rights reserved. // #import "Model.h" @implementation Model + (instancetype)ModelWithNormalHeight:(CGFloat)normalHeight expendHeight:(CGFloat)expendHeight expend:(BOOL)expend { Model *model = [[Model alloc] init]; model.normalHeight = normalHeight; model.expendHeight = expendHeight; model.expend = expend; return model; } @end
// // InfoCell.h // TableViewTapAnimation // // Created by YouXianMing on 15/9/18. // Copyright © 2015年 YouXianMing. All rights reserved. // #import <UIKit/UIKit.h> #import "Model.h" @interface InfoCell : UITableViewCell @property (nonatomic, weak) NSIndexPath *indexPath; @property (nonatomic, weak) UITableView *tableView; - (void)loadData:(id)data; @end
// // InfoCell.m // TableViewTapAnimation // // Created by YouXianMing on 15/9/18. // Copyright © 2015年 YouXianMing. All rights reserved. // #import "InfoCell.h" @interface InfoCell () @property (nonatomic, strong) UIButton *button; @property (nonatomic, weak) Model *model; @property (nonatomic, strong) UIView *lineView; @property (nonatomic, strong) UILabel *infoLabel; @end @implementation InfoCell - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { [self setup]; } return self; } - (void)setup { self.selectionStyle = UITableViewCellSelectionStyleNone; self.button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; [self.button addTarget:self action:@selector(buttonEvent) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:self.button]; self.lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 49.5, 320, 0.5f)]; self.lineView.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.5f]; [self addSubview:self.lineView]; self.infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 100, 50)]; self.infoLabel.text = @"Demo"; [self addSubview:self.infoLabel]; } - (void)buttonEvent { if (self.model.expend == YES) { self.model.expend = NO; [self.tableView beginUpdates]; [self.tableView endUpdates]; [self normalStateWithAnimated:YES]; } else { self.model.expend = YES; [self.tableView beginUpdates]; [self.tableView endUpdates]; [self expendStateWithAnimated:YES]; } } - (void)loadData:(id)data { self.model = data; if (self.model.expend == YES) { self.lineView.frame = CGRectMake(0, 99.5f, 320, 0.5f); self.infoLabel.frame = CGRectMake(30, 0, 100, 50); } else { self.lineView.frame = CGRectMake(0, 49.5, 320, 0.5f); self.infoLabel.frame = CGRectMake(10, 0, 100, 50); } } - (void)normalStateWithAnimated:(BOOL)animated { if (animated == YES) { [UIView animateWithDuration:0.35f animations:^{ self.lineView.frame = CGRectMake(0, 49.5, 320, 0.5f); self.infoLabel.frame = CGRectMake(10, 0, 100, 50); }]; } else { self.lineView.frame = CGRectMake(0, 49.5, 320, 0.5f); self.infoLabel.frame = CGRectMake(10, 0, 100, 50); } } - (void)expendStateWithAnimated:(BOOL)animated { if (animated == YES) { [UIView animateWithDuration:0.35f animations:^{ self.lineView.frame = CGRectMake(0, 99.5f, 320, 0.5f); self.infoLabel.frame = CGRectMake(30, 0, 100, 50); }]; } else { self.lineView.frame = CGRectMake(0, 99.5f, 320, 0.5f); self.infoLabel.frame = CGRectMake(30, 0, 100, 50); } } @end
// // ViewController.m // TableViewTapAnimation // // Created by YouXianMing on 15/9/18. // Copyright © 2015年 YouXianMing. All rights reserved. // #import "ViewController.h" #import "InfoCell.h" #import "Model.h" #define INFO_CELL @"INFO_CELL" @interface ViewController () <UITableViewDelegate, UITableViewDataSource> @property (nonatomic, strong) NSMutableArray *datasArray; @property (nonatomic, strong) UITableView *tableView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.datasArray = [NSMutableArray array]; [self.datasArray addObject:[Model ModelWithNormalHeight:50.f expendHeight:100.f expend:NO]]; [self.datasArray addObject:[Model ModelWithNormalHeight:50.f expendHeight:100.f expend:YES]]; [self.datasArray addObject:[Model ModelWithNormalHeight:50.f expendHeight:100.f expend:YES]]; [self.datasArray addObject:[Model ModelWithNormalHeight:50.f expendHeight:100.f expend:YES]]; [self.datasArray addObject:[Model ModelWithNormalHeight:50.f expendHeight:100.f expend:YES]]; [self.datasArray addObject:[Model ModelWithNormalHeight:50.f expendHeight:100.f expend:YES]]; self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; self.tableView.delegate = self; self.tableView.dataSource = self; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; [self.tableView registerClass:[InfoCell class] forCellReuseIdentifier:INFO_CELL]; [self.view addSubview:self.tableView]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return _datasArray.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { InfoCell *cell = [tableView dequeueReusableCellWithIdentifier:INFO_CELL]; cell.indexPath = indexPath; cell.tableView = tableView; [cell loadData:_datasArray[indexPath.row]]; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { Model *model = _datasArray[indexPath.row]; if (model.expend) { return model.expendHeight; } else { return model.normalHeight; } } @end
细节
![](http://images2015.cnblogs.com/blog/607542/201509/607542-20150918233905836-1450482596.png)
相关文章推荐
- Mysql 外网访问控制
- 记录一次EasyUI 的treegrid优化实践
- LeetCode283——Move Zeroes我的解法
- Java程序猿8大排序算法
- Calculator
- Java知识整理(五)之SE.(Date+SimpleDateFormat+Calendar)
- 要看清的不是别人,要先看清自己
- HDU 1698(线段树 区间更新)
- block应用与保留环
- CentOS Ping 755 644 查找并删除
- 霓歌即时通讯中的相关专利整理(十一)
- 今天开始做战斗,回合制战斗代码实现第四篇 刀塔传奇战斗模式(即时卡牌战斗模式)
- TCP/IP的三次握手,四次分手。
- UVA - 562 Dividing coins(01背包)
- ubuntu
- leetcode-32 Longest Valid Parentheses
- OpenMesh+Qt+vs2010
- HDU 2759
- A + B Problem II
- 权限控制easyui datagrid filed里面的内容