tableviewcell 自适应高度(模型数据自适应)

原创 2015年11月18日 14:27:59

首先先来理一下具体步骤:

1、新建一个自定义的tableviewcell类

2、初始化tableviewcell时同时初始化所有子控件<这里可以先设置子控件的一些属性包括字体、颜色等>

3、提供两个模型类

a、一个是我们常用的数据模型

b、一个是frame模型(数据模型+所有子控件的frame+cell的高度)起个名modelFrame

4、在自定义的cell 中应该提供一个frame属性<modelFrame>

a、将modelFrame模型传递给cell

b、cell根据modelFrame模型给子控件设置frame,根据数据模型给子控件设置具体的数据

5、在tableview的数据源方法中返回cell 的高度

上代码

1、新建一个自定义的tableviewcell类

#import <UIKit/UIKit.h>

@class DescriptionModelFrame;

@interface DetailCell : UITableViewCell

@property(nonatomic,strong)DescriptionModelFrame * DesFrame;

@end

实现文件中

#import "DetailCell.h"

#import "DescriptionModel.h"

#import "DescriptionModelFrame.h"

@interface DetailCell()

@property(nonatomic,strong)UILabel * titleLabel;标题

@property(nonatomic,strong)UILabel * desLabel;详细描述


@end

@implementation DetailCell

-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

{

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self) {

        self.selectionStyle = UITableViewCellSelectionStyleNone;//去掉cell 点击效果

        [self initSubControl];

    }

    return self;

}

-(void)initSubControl

{

    UILabel * titleLable = [[UILabel alloc] init];

    titleLable.font = [UIFont systemFontOfSize:15*ScreenZoomScaleSix];

    titleLable.backgroundColor = [UIColor whiteColor];

    self.titleLabel = titleLable;

    [self.contentView addSubview:titleLable];

    

    UILabel * desLabel = [[UILabel alloc] init];

    desLabel.font = [UIFont systemFontOfSize:15*ScreenZoomScaleSix];

    desLabel.numberOfLines = 0;

    desLabel.textColor = [UIColor lightGrayColor];

    desLabel.backgroundColor = [UIColor whiteColor];

    self.desLabel = desLabel;

    [self.contentView addSubview:desLabel];

    

}

-(void)setDesFrame:(DescriptionModelFrame *)DesFrame

{

    _DesFrame = DesFrame;

    DescriptionModel * model = DesFrame.desModel;

    

    self.titleLabel.frame = DesFrame.titleLabelF;

    self.titleLabel.text = model.attrName;

    self.desLabel.frame = DesFrame.desLabelF;

    self.desLabel.text = model.attrValue;

}

@end


3、提供两个模型类

a、一个是我们常用的数据模型

#import <Foundation/Foundation.h>


@interface DescriptionModel : NSObject

/**

 * 标题

 */

@property(nonatomic,strong)NSString * attrName;

/**

 * 详细描述

 */

@property(nonatomic,strong)NSString * attrValue;

@end

b、一个是frame模型(数据模型+所有子控件的frame+cell的高度)起个名modelFrame

#import <Foundation/Foundation.h>

@class DescriptionModel;

@interface DescriptionModelFrame : NSObject

@property(nonatomic,assign)CGRect titleLabelF; 标题frame

@property(nonatomic,assign)CGRect desLabelF; 详情frame

@property(nonatomic,strong)DescriptionModel * desModel; 数据模型

@property(nonatomic,assign)CGFloat cellH; 单元格的高度

@end

实现文件中

#import "DescriptionModelFrame.h"

#import "DescriptionModel.h"

#define SCREENW [UIScreen mainScreen].bounds.size.width

#define LEFTMEGIN 10

@implementation DescriptionModelFrame

-(void)setDesModel:(DescriptionModel *)desModel

{

    _desModel = desModel;

    

    CGFloat cellW = SCREENW;

    CGFloat titleW = cellW-2*10*ScreenZoomScaleSix;

    CGFloat titleH = 15*ScreenZoomScaleSix;

    CGFloat titleX = LEFTMEGIN*ScreenZoomScaleSix;

    CGFloat titleY = 10*ScreenZoomScaleSix;

    self.titleLabelF = CGRectMakeLiu(titleX, titleY, titleW, titleH);

    

    CGSize desSize = [self sizeWithString:desModel.attrValue font:[UIFont systemFontOfSize:15*ScreenZoomScaleSix]];

    CGFloat desX = LEFTMEGIN*ScreenZoomScaleSix;

    CGFloat desY = CGRectGetMaxY(self.titleLabelF)+LEFTMEGIN*ScreenZoomScaleSix;

    self.desLabelF = (CGRect){{desX,desY},desSize};

    

    CGFloat cellH = CGRectGetMaxY(self.desLabelF)+LEFTMEGIN*ScreenZoomScaleSix;

    self.cellH = cellH;

    

}

- (CGSize)sizeWithString:(NSString *)string font:(UIFont *)font

{

    CGRect rect = [string boundingRectWithSize:CGSizeMake(SCREENW-10*ScreenZoomScaleSix*2, 8000)                                       options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesFontLeading  |NSStringDrawingUsesLineFragmentOrigin

                                    attributes:@{NSFontAttributeName: font}                                       context:nil];

    

    return rect.size;

}

@end


好了几乎可以大功告成了 下来说说在控制器中如何来搞(里边是我的一些数据可以参考)

NSArray * modeleArray = [DescriptionModel objectArrayWithKeyValuesArray:self.dataDic[@"goodsDetail"][@"goodsAttrs"]];

        NSArray * modelFrameArray = [self modelsFramesWithModls:modeleArray];

        self.modelFrameArray = [modelFrameArray mutableCopy];


//数据模型转frame模型

- (NSArray *)modelsFramesWithModls:(NSArray *)models

{

    NSMutableArray *frames = [NSMutableArray array];

    for (DescriptionModel *model in models) {

        DescriptionModelFrame *f = [[DescriptionModelFrame alloc] init];

        f.desModel = model;

        [frames addObject:f];

    }

    return frames;

}


、、在数据源方法中一句代码搞定

// cell传递模型数据

    cell.DesFrame = self.modelFrameArray[indexPath.row];


cell的高度也出来了

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

    DescriptionModelFrame *frame = self.modelFrameArray[indexPath.row];

    return frame.cellH;

}

给个图参考一下 我把单元格分割线去掉了


当然如果搞复杂的单元格 思路是对的 只不过 计算的东西多了




版权声明:本文为博主原创文章,未经博主允许不得转载。

tableViewCell 自适应高度

  • 2017年05月10日 17:34
  • 82KB
  • 下载

2015 / 11 / 14 日结 /tableviewcell高度的坑 / label 自适应的坑 / heardview 头部的坑

今天遇到的问题: 1,heardview 头部高度问题,当设置tableview的tableviewheardview属性,再调用系统方法 - (CGFloat)tableView:(UITableV...

65.TableViewCell 自适应高度最优方法

在开发中遇到自适应高度的 tableviewcell 是很常见的, 但是到底这些方法中那些才是最优的呢, 今天就来说一说. 核心工作在 TableviewDatasource 的方法heightFor...

iOS之如何自适应TableViewCell的高度

1. 问题描述:     在项目中会遇到由于每个cell的图片和文本大小不一致,如果cell的height高度设置不合理的话,对用户体验不是很好。但是如果对cell的height高度设定死之后,当...

TableviewCell自适应高度之加载不同数量的图片。

题外话:项目中有这样的需求,商品评论可以发布文字和图片(不同数量的图片)创建 UITableView在 ViewController 里创建 UITableView// 商品评论 _comme...

tableViewCell自适应高度

#import "RootViewController.h" #import "MyCell.h" @interface RootViewController () @property(nonatom...

tableViewCell自适应高度(QQ聊天室模拟)

先看一看效果吧! 废话不多说直接上代码代码下载请猛戳这里先看一看代码结构图: MessageModel代码:#import "MessageModel.h"@implementatio...

IOS自适应TableViewCell实例

  • 2014年01月10日 20:53
  • 322KB
  • 下载

iOS UI设计: 在Autolayout自适应的情况下tableviewcell高度自适应

经常查阅资料和自己的研究,现在有一个较为高效的方法。 首先前提条件 1. Cell 用xib方式自定义。 内嵌有 icon头像 labelview多行文本框 2. 导致高度变化的就是这个多行文本...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:tableviewcell 自适应高度(模型数据自适应)
举报原因:
原因补充:

(最多只允许输入30个字)