【第22期】观点:IT 行业加班,到底有没有价值?

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;

}

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


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




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

相关文章推荐

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

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

子div,span浮动导致父级div高度不能自适应

解决方法一:使用css clear清除浮动   对父级div标签闭合&lt;/div&gt;前加一个clear清除浮动对象。   &lt;style type="text/css"&gt; .one

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

tableViewCell 上面webView 自适应高度

这个问题目前我解决的方式是在加载cell的时候先计算一下webView的contentSize,但是在 - (void)webViewDidFinishLoad:(UIWebView *)webVi...

iframe自适应高度并解决jquery ajax获取数据后高度自适应问题

很多管理系统中,都使用iframe进行信息内容的展示方式,或者作为主菜单的链接展示内容。 使用iframe的问题就是自适应高度的问题。   iframe自适应高度本身是很简单的方法,就是在页面加载完成后,重新计算一下高度即可。代码如下: //公共方法:设置iframe的高度以保证全...

TableViewCell高度自适应的实现方案

使用swift编写的,OC也很容易翻译过去  编写了String的扩展,    func size(font: UIFont,paragraph_style: NSMutableParagrap...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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