步骤1:
//创建模型类.h
HggText.h
#import <Foundation/Foundation.h>
@interface HggText : NSObject
@property (nonatomic, copy) NSString *text; //文本
@property (nonatomic, assign) float textHeight; //文本的高度
@property (nonatomic, assign) BOOL isOpen; //是否展开
+(void)getDataComplete:(void (^)(NSMutableArray<HggText *>* dataArray))complete;
@end
//实现方法.m
#import "HggText.h"
@implementation HggText
- (void)setText:(NSString *)text
{
_text = text;
CGFloat windowWidth = [UIScreen mainScreen].bounds.size.width;
/** 这里计算label的宽的时候 一定不要有偏差 否则算出的高度不准确*/
_textHeight = [text boundingRectWithSize:CGSizeMake(windowWidth - 10, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:14]} context:nil].size.height + 1;//(末尾 这个 1 是有可能计算存在误差为矫正数值)
}
+ (void)getDataComplete:(void (^)(NSMutableArray<HggText *> *))complete
{
NSMutableArray *array = [NSMutableArray array];
complete?complete(array):nil;
}
@end
2.步骤2
//创建相应的自定义cell.h
#import <UIKit/UIKit.h>
#import "HggText.h"
//创建代理的方法
@protocol TextCellDelegate <NSObject>
/** 点击展开按钮 **/
-(void)openTextWithModel:(HggText *)model;
@end
@interface HggTableViewCell : UITableViewCell
@property (nonatomic, strong) HggText *model;
@property (nonatomic, weak)id<TextCellDelegate>delegate;
@end
//实现方法.m
#import "HggTableViewCell.h"
@interface HggTableViewCell ()
@property (nonatomic, strong) UILabel *contentLabel; //展开的文字
@property (nonatomic, strong) UIButton *menuButton; //展开的按钮
@end
@implementation HggTableViewCell
// 实现的方法
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
if(self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]){
[self createUI];
}
return self;
}
#pragma mark -- 点击的事件
- (void)setModel:(HggText *)model
{
_model = model;
self.contentLabel.text = model.text;
self.menuButton.selected = model.isOpen;
}
- (void)buttonClick
{
if ([self.delegate respondsToSelector:@selector(openTextWithModel:)]) {
[self.delegate openTextWithModel:self.model];
}
}
#pragma mark -- 创建UI
-(void)createUI
{
self.menuButton = ({
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setTitle:@"展开" forState:UIControlStateNormal];
[button setTitle:@"收起" forState:UIControlStateSelected];
[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor blueColor] forState:UIControlStateSelected];
button.titleLabel.font = [UIFont systemFontOfSize:14];
[button addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:button];
[button mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.bottom.mas_equalTo(self.contentView).offset(-5);
make.size.mas_equalTo(CGSizeMake(40, 20));
}];
button;
});
self.contentLabel = ({
UILabel *label = [[UILabel alloc] init];
label.font = [UIFont systemFontOfSize:14];
label.numberOfLines = 0; //必须的
[self.contentView addSubview:label];
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.equalTo(self.contentView).offset(5);
make.right.mas_equalTo(self.contentView).offset(-5);
make.bottom.mas_equalTo(self.menuButton.mas_top);
}];
label;
});
}
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
@end
3.步骤3 在控制器中调用
//.h
#import <UIKit/UIKit.h>
@interface TCStretchViewController : UIViewController
@end
//.m
#import "TCStretchViewController.h"
#import "HexColors.h"
#import "HggTableViewCell.h"
@interface TCStretchViewController ()<UITableViewDelegate,UITableViewDataSource,TextCellDelegate>
@property (nonatomic , strong) UITableView *stretchtable;
@property (nonatomic , strong) NSMutableArray *dataArray;
@end
@implementation TCStretchViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
self.title = @"cell伸展";
//创建tableView
[self createTableView];
/*** 获取数据 ***/
[HggText getDataComplete:^(NSMutableArray<HggText *> *dataArray) {
NSArray *textArray = @[@"古时候口罩是一个小小的道具我在这头强盗在那头小时候口罩是心中深深的恐惧我在这头针头在那/Users/Macx/Desktop/OpenOrClose/OpenOrClose/TextModel.m头再后来口罩是2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头",@"小学时梦想当科学家,后来发现在自己想多了!初中时,梦想着自己能够回家住,第一次离开家嗷嗷大哭,后来发现自己想多了!高中时,梦想着自己能够被女神注意,后来发现自己想多了,大学时,梦想着自己心灵得到净化,后来发现自己想多了!工作时,梦想着自己以后的规划,想来想去发现自己还是想多了!到后来才发现,自己长大了,也累了",@"我爱的人不是我的爱人她心里每一寸都属于另一个人她真幸福幸福得真残忍让我又爱又恨她的爱怎么那么深我爱的人她已有了爱人从他们的眼神说明了我不可能每当听见她或他说我们就像听见爱情永恒的嘲笑声她做了她觉得对的选择我只好祝福她真的对了爱不到我最想要爱的人谁还能要我怎样呢",@"当我每次说出那些话的时候,我的心是很难受的可能我真的不够爱你吧不够心疼你对你提不起劲对不起也许是真的不爱了吧后来口罩是2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头后来口罩是2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头",@"也许压根就没有爱过吧2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头后来口罩是2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头后来口罩是2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头后来口罩是2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头后来口罩是2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头",@"2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头后来口罩是2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头后来口罩是2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头后来口罩是2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头后来口罩是2003浅浅的记忆我在这头SARS在那头现如今口罩是全民的防霾神器我在这头却看不清谁在那头",@"我爱的人不是我的爱人她心里每一寸都属于另一个人她真幸福幸福得真残忍让我又爱又恨她的爱怎么那么深我爱的人她已有了爱人从他们的眼神说明了我不可能每当听见她或他说我们就像听见爱情永恒的嘲笑声她做了她觉得对的选择我只好祝福她真的对了爱不到我最想要爱的人谁还能要我怎样呢我爱的人不是我的爱人她心里每一寸都属于另一个人她真幸福幸福得真残忍让我又爱又恨她的爱怎么那么深我爱的人她已有了爱人从他们的眼神说明了我不可能每当听见她或他说我们就像听见爱情永恒的嘲笑声她做了她觉得对的选择我只好祝福她真的对了爱不到我最想要爱的人谁还能要我怎样呢",@"我爱的人不是我的爱人她心里每一寸都属于另一个人她真幸福幸福得真残忍让我又爱又恨她的爱怎么那么深我爱的人她已有了爱人从他们的眼神说明了我不可能每当听见她或他说我们就像听见爱情永恒的嘲笑声她做了她觉得对的选择我只好祝福她真的对了爱不到我最想要爱的人谁还能要我怎样呢我爱的人不是我的爱人她心里每一寸都属于另一个人她真幸福幸福得真残忍让我又爱又恨她的爱怎么那么深我爱的人她已有了爱人从他们的眼神说明了我不可能每当听见她或他说我们就像听见爱情永恒的嘲笑声她做了她觉得对的选择我只好祝福她真的对了爱不到我最想要爱的人谁还能要我怎样呢我爱的人不是我的爱人她心里每一寸都属于另一个人她真幸福幸福得真残忍让我又爱又恨她的爱怎么那么深我爱的人她已有了爱人从他们的眼神说明了我不可能每当听见她或他说我们就像听见爱情永恒的嘲笑声她做了她觉得对的选择我只好祝福她真的对了爱不到我最想要爱的人谁还能要我怎样呢",@"我爱的人不是我的爱人她心里每一寸都属于另一个人她真幸福幸福得真残忍让我又爱又恨她的爱怎么那么深我爱的人她已有了爱人从他们的眼神说明了我不可能每当听见她或他说我们就像听见爱情永恒的嘲笑声她做了她觉得对的选择我只好祝福她真的对了爱不到我最想要爱的人谁还能要我怎样呢我爱的人不是我的爱人她心里每一寸都属于另一个人她真幸福幸福得真残忍让我又爱又恨她的爱怎么那么深我爱的人她已有了爱人从他们的眼神说明了我不可能每当听见她或他说我们就像听见爱情永恒的嘲笑声她做了她觉得对的选择我只好祝福她真的对了爱不到我最想要爱的人谁还能要我怎样呢我爱的人不是我的爱人她心里每一寸都属于另一个人她真幸福幸福得真残忍让我又爱又恨她的爱怎么那么深我爱的人她已有了爱人从他们的眼神说明了我不可能每当听见她或他说我们就像听见爱情永恒的嘲笑声她做了她觉得对的选择我只好祝福她真的对了爱不到我最想要爱的人谁还能要我怎样呢",@"我爱的人不是我的爱人她心里每一寸都属于另一个人她真幸福幸福得真残忍让我又爱又恨她的爱怎么那么深我爱的人她已有了爱人从他们的眼神说明了我不可能每当听见她或他说我们就像听见爱情永恒的嘲笑声她做了她觉得对的选择我只好祝福她真的对了爱不到我最想要爱的人谁还能要我怎样呢我爱的人不是我的爱人她心里每一寸都属于另一个人她真幸福幸福得真残忍让我又爱又恨她的爱怎么那么深我爱的人她已有了爱人从他们的眼神说明了我不可能每当听见她或他说我们就像听见爱情永恒的嘲笑声她做了她觉得对的选择我只好祝福她真的对了爱不到我最想要爱的人谁还能要我怎样呢"];
for (int i = 0; i < textArray.count; i++) {
HggText *model = [[HggText alloc]init];
model.text = textArray[i];
[dataArray addObject:model];
}
self.dataArray = dataArray;
}];
// Do any additional setup after loading the view.
}
#pragma mark -- 代理的方法
-(void)openTextWithModel:(HggText *)model
{
model.isOpen = !model.isOpen;// 改变 是否展开 的状态值
//判断是哪一行
NSInteger index = [self.dataArray indexOfObject:model];
/**刷新指定行*/
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
[self.stretchtable reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
#pragma mark -- 创建tableView
-(void)createTableView
{
self.stretchtable = [[UITableView alloc]init];
self.stretchtable.delegate = self;
self.stretchtable.dataSource = self;
self.stretchtable.tableFooterView = [[UIView alloc]init];
self.stretchtable.frame = CGRectMake(0, 0, WIDTH, HEIGHT);
[self.view addSubview:self.stretchtable];
}
//deteglt
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
HggText *model = self.dataArray[indexPath.row];
if(model.isOpen){
return model.textHeight + 30;//(这个30 是指 label上下间距 和 按钮高度)
}
else{
if (model.textHeight>60) { // 规定个默认高度 60 + 30
return 90;
}
return model.textHeight + 30;
}
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.dataArray.count;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
HggTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if(!cell){
cell = [[HggTableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:@"cell"];
}
cell.delegate = self;
cell.model = self.dataArray[indexPath.row];
cell.backgroundColor = [UIColor colorWithHexString:@"00AAFF"];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
提示:中间的文字数据一般都是网络获取下来的,这里记载的是假数据