美文网首页iOS Developer
UITableView动态计算Cell高度

UITableView动态计算Cell高度

作者: Hither | 来源:发表于2016-03-21 18:19 被阅读2703次

    在我们使用UITableView的时候经常会遇到这样的需求,Cell的高度各种各样,不是固定的。解决办法可以参考下面代码:

    • Model
    在Model中,我们定义四个属性;
    .h
    @property (nonatomic,copy) NSString *name;
    @property (nonatomic,copy) NSString *author;
    @property (nonatomic,copy) NSString *summary;
    @property (nonatomic,copy) NSString *img;
    .m
    -(void)setValue:(id)value forUndefinedKey:(NSString *)key{
        
    }
    
    • View
      .h
    #import <UIKit/UIKit.h>
    @class healthBookModel;
    @interface BooksTableViewCell : UITableViewCell
    @property (nonatomic,strong) healthBookModel *model;
    @property (weak, nonatomic) IBOutlet UIImageView *img;
    @property (weak, nonatomic) IBOutlet UILabel *summary;
    @property (weak, nonatomic) IBOutlet UILabel *author;
    @property (weak, nonatomic) IBOutlet UILabel *name;
    
    @end
    
    

    .m

    -(void)setModel:(healthBookModel *)model{
        _model = model;
        _summary.text = model.summary;
        _author.text = model.author;
        _name.text = model.name;
        [_img sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://tnfs.tngou.net/image%@",model.img]]];
        
    }
    

    XIB:
    在XIB文件中 我们是让summary这个Lable高度不确定 所以 我们只限定它的宽 和 高 ;


    • Controller

    Model和View准备好了以后 接下来在Controller中这样做:

    .m文件中内容

    
    #import "ViewController.h"
    #import "healthBookModel.h"
    #import "BooksTableViewCell.h"
    #import "YYModel.h"
    #import "MJRefresh.h"
    #define WIDTH self.view.bounds.size.width
    #define HEIGHT self.view.bounds.size.height
    static NSString *cellReuseID = @"cellReuseID";
    
    @interface ViewController ()<UITableViewDelegate,UITableViewDataSource>{
        NSInteger currentPage;
    }
    @property (strong, nonatomic) UITableView *mainTableView;
    @property (strong, nonatomic) NSMutableArray *dataArray; 
    @property (assign, nonatomic) CGFloat originCellMaxY;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.originCellMaxY = [self getCellLastControlMaxY];
        //调用创建TableView的方法
        [self createTableView];
        //设置标题
        UILabel *Title = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 80, 40)];
        Title.textColor = [UIColor whiteColor];
        Title.backgroundColor = [UIColor clearColor];
        Title.textAlignment = NSTextAlignmentCenter;
        Title.text = @"健康书籍";
        Title.font = [UIFont fontWithName:@"Helvetica-Bold" size:26];
        self.navigationItem.titleView = Title;
        
        [_mainTableView.mj_header endRefreshing];
        
    }
    
    -(void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:YES];
        //试图将要出现的时候  开始刷新数据
        [_mainTableView.mj_header beginRefreshing];
    }
    
    -(void)getData{
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            NSString *httpUrl =[NSString stringWithFormat:@"http://www.tngou.net/api/book/list?id=&rows=10&page=%ld",(unsigned long)currentPage] ;
            
            NSURL *url = [NSURL URLWithString:httpUrl];
            NSURLSession *session = [NSURLSession sharedSession];
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                    
                    if (!error&&data) {
                        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:1 error:nil];
                        NSNull *value = [NSNull null];
                        if (dict[@"tngou"]!=value) {
                            
                            dispatch_async(dispatch_get_main_queue(), ^{
                                for (NSDictionary *myDict in dict[@"list"]) {
                                    healthBookModel *model = [[healthBookModel alloc]init];
                                    [model yy_modelSetWithDictionary:myDict];
                                    [_dataArray addObject:model];
                                    [_mainTableView reloadData];
                                    [_mainTableView.mj_header endRefreshing];
                                    [_mainTableView.mj_footer endRefreshing];
                                }
                            });
                        }
                    }
                    else{
                        currentPage--;
                    }
                }];
                [task resume];
            });
        });
    }
    //加在数据模型  初始化页面  初始化数组  请求数据
    -(void)loadDataModel{
        currentPage = 1;
        if (!_dataArray) {
            _dataArray  = [NSMutableArray array];
        }
        [self getData];
    }
    
    -(void)createTableView{
        
        _mainTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, WIDTH, HEIGHT) style:UITableViewStylePlain];
    //注册Cell
        [_mainTableView registerNib:[UINib nibWithNibName:@"BooksTableViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:cellReuseID];
        [self.view addSubview:_mainTableView];
        //设置TableView的代理  数据源
        _mainTableView.delegate = self;
        _mainTableView.dataSource = self;
        //下拉刷新的时候  加在数据模型
        _mainTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
            [self loadDataModel];
        }];
    //上拉加在更多的时候 页数加1  请求数据
        _mainTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
            currentPage++;
            [self getData];
        }];
    }
    //返回TableView中行数
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return _dataArray.count;
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        //重用Cell
        BooksTableViewCell *cell = [_mainTableView dequeueReusableCellWithIdentifier:cellReuseID ];
        if (!cell) {
            cell = (BooksTableViewCell*)[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier: cellReuseID];
        }
    //为Cell绑定的Model赋值
        cell.model = _dataArray[indexPath.row];
        
        // 获取不确定文字的高度
        NSString *content = cell.model.summary;
        CGFloat testHeight = [self sizeWithFont:[UIFont systemFontOfSize:14.0] maxW:cell.frame.size.width withContent:content] + 10;
        
        // 重新设置cell的frame.
        CGRect frame = cell.frame;
        frame.size.height = testHeight + self.originCellMaxY;
        cell.frame = frame;
        return cell;
    }
    
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        // 直接返回该indexPath对应cell的frame.size.height. (在cellForRowAtIndexPath方法中会重新更改)
        BooksTableViewCell *cell = (BooksTableViewCell *)[self tableView:tableView cellForRowAtIndexPath:indexPath];
        return cell.frame.size.height;
    }
    
    
    // 计算指定文字的高度
    -(CGFloat)sizeWithFont:(UIFont *)font maxW:(CGFloat) maxW withContent:(NSString *)testStr{
        
        NSDictionary *textAttrs = @{NSFontAttributeName : font};
        CGSize size = CGSizeMake(maxW, MAXFLOAT);
        return [testStr boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:textAttrs context:nil].size.height;
    }
    
    // 获取cell最底部控件的最大Y值
    -(CGFloat)getCellLastControlMaxY {
        // 获取cell中最底部的控件
        BooksTableViewCell *tempCell = (BooksTableViewCell *)[[[NSBundle mainBundle] loadNibNamed:@"BooksTableViewCell" owner:nil options:nil] lastObject];
        UILabel *lastLabel = tempCell.author;
        return  lastLabel.frame.origin.y + lastLabel.bounds.size.height;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    
    

    效果:

    再介绍另一种用起来比较简单的

    在UITableViewDelegate中这样使用:
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
        CGFloat height = [HJTTableViewCell CellHeightForTableView:tableView indexPath:indexPath cellContentViewWidth:0 bottomOffset:10];
        return height;
    }
    
    在cell绘制中加上
    self.cellBottomView = self.nameLab;
    
    就可以了
    
    

    效果图:

    具体代码:

    另外一种的Demo

    相关文章

      网友评论

        本文标题:UITableView动态计算Cell高度

        本文链接:https://www.haomeiwen.com/subject/wuuklttx.html