用Model来计算cell的高度

效果:

将计算cell高度的方法直接移植到Model当中,初始化的瞬间就计算好了高度,非常好用!

源码:

Model

//
//  Model.h
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface Model : NSObject

@property (nonatomic, strong) NSString       *info;
@property (nonatomic, strong) NSString       *subInfo;
@property (nonatomic, strong) NSString       *details;

@property (nonatomic, assign) CGFloat         infoHeight;
@property (nonatomic, assign) CGFloat         subInfoHeight;
@property (nonatomic, assign) CGFloat         detailsHeight;
@property (nonatomic, assign) CGFloat         totalHeight;

- (void)setValue:(id)value forUndefinedKey:(NSString *)key;
- (instancetype)initWithDictionary:(NSDictionary *)dictionary;

@end
//
//  Model.m
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "Model.h"

@implementation Model

- (void)setValue:(id)value forUndefinedKey:(NSString *)key {

}

- (void)setValue:(id)value forKey:(NSString *)key {
    if ([value isKindOfClass:[NSNull class]]) {
        return;
    }

    [super setValue:value forKey:key];
}

- (instancetype)initWithDictionary:(NSDictionary *)dictionary {
    self = [super init];
    if (self) {
        if ([dictionary isKindOfClass:[NSDictionary class]]) {
            [self setValuesForKeysWithDictionary:dictionary];
        }
    }

    self.infoHeight    = [Model heightWithString:self.info    LabelFont:[UIFont boldSystemFontOfSize:18.f] withLabelWidth:300];
    self.subInfoHeight = [Model heightWithString:self.subInfo LabelFont:[UIFont systemFontOfSize:14.f] withLabelWidth:300];
    self.detailsHeight = [Model heightWithString:self.details LabelFont:[UIFont italicSystemFontOfSize:16.f] withLabelWidth:300];
    self.totalHeight   = self.infoHeight + self.subInfoHeight + self.detailsHeight;

    return self;
}

#pragma mark - 计算文本高度
+ (CGFloat)heightWithString:(NSString *)string LabelFont:(UIFont *)font withLabelWidth:(CGFloat)width {
    CGFloat height = 0;

    if (string.length == 0) {
        height = 0;
    } else {

        // 字体
        NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]};
        if (font) {
            attribute = @{NSFontAttributeName: font};
        }

        // 尺寸
        CGSize retSize = [string boundingRectWithSize:CGSizeMake(width, MAXFLOAT)
                                              options:
                          NSStringDrawingTruncatesLastVisibleLine |
                          NSStringDrawingUsesLineFragmentOrigin |
                          NSStringDrawingUsesFontLeading
                                           attributes:attribute
                                              context:nil].size;

        height = retSize.height;
    }

    return height;
}

@end

ModelCell

//
//  ModelCell.h
//  HeightModel
//
//  Created by YouXianMing on 15/1/10.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ModelCell : UITableViewCell

@property (nonatomic, strong) UILabel   *info;
@property (nonatomic, strong) UILabel   *subInfo;
@property (nonatomic, strong) UILabel   *details;

- (void)accessData:(id)model;

@end
//
//  ModelCell.m
//  HeightModel
//
//  Created by YouXianMing on 15/1/10.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ModelCell.h"
#import "Model.h"
#import "UIView+SetRect.h"

@implementation ModelCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {

        _info                  = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 300, 20)];
        _info.numberOfLines    = 0;
        _info.font             = [UIFont boldSystemFontOfSize:18.f];
        _info.textColor        = [UIColor blackColor];
        [self addSubview:_info];

        _subInfo               = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 300, 20)];
        _subInfo.numberOfLines = 0;
        _subInfo.font          = [UIFont systemFontOfSize:14.f];
        _subInfo.textColor     = [UIColor grayColor];
        [self addSubview:_subInfo];

        _details               = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 300, 20)];
        _details.numberOfLines = 0;
        _details.font          = [UIFont italicSystemFontOfSize:16.f];
        _details.textColor     = [UIColor redColor];
        [self addSubview:_details];

    }

    return self;
}

- (void)accessData:(id)model {
    if ([model isKindOfClass:[Model class]]) {
        Model *dataModel = model;

        _info.text   = dataModel.info;
        _info.frame  = CGRectMake(10, 10, 300, 20);
        [_info sizeToFit];

        _subInfo.text  = dataModel.subInfo;
        _subInfo.frame = CGRectMake(10, _info.height + 10, 300, 20);
        [_subInfo sizeToFit];

        _details.text  = dataModel.details;
        _details.frame = CGRectMake(10, _info.height + _subInfo.height + 10, 300, 20);
        [_details sizeToFit];
    }
}

@end

工具类 UIView+SetRect

//
//  UIView+SetRect.h
//  TestPch
//
//  Created by YouXianMing on 14-9-26.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UIView (SetRect)

// Frame
@property (nonatomic) CGPoint viewOrigin;
@property (nonatomic) CGSize  viewSize;

// Frame Origin
@property (nonatomic) CGFloat x;
@property (nonatomic) CGFloat y;

// Frame Size
@property (nonatomic) CGFloat width;
@property (nonatomic) CGFloat height;

// Frame Borders
@property (nonatomic) CGFloat top;
@property (nonatomic) CGFloat left;
@property (nonatomic) CGFloat bottom;
@property (nonatomic) CGFloat right;

// Center Point
#if !IS_IOS_DEVICE
@property (nonatomic) CGPoint center;
#endif
@property (nonatomic) CGFloat centerX;
@property (nonatomic) CGFloat centerY;

// Middle Point
@property (nonatomic, readonly) CGPoint middlePoint;
@property (nonatomic, readonly) CGFloat middleX;
@property (nonatomic, readonly) CGFloat middleY;

@end
//
//  UIView+SetRect.m
//  TestPch
//
//  Created by YouXianMing on 14-9-26.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "UIView+SetRect.h"

@implementation UIView (SetRect)

#pragma mark Frame

- (CGPoint)viewOrigin
{
    return self.frame.origin;
}

- (void)setViewOrigin:(CGPoint)newOrigin
{
    CGRect newFrame = self.frame;
    newFrame.origin = newOrigin;
    self.frame = newFrame;
}

- (CGSize)viewSize
{
    return self.frame.size;
}

- (void)setViewSize:(CGSize)newSize
{
    CGRect newFrame = self.frame;
    newFrame.size = newSize;
    self.frame = newFrame;
}

#pragma mark Frame Origin

- (CGFloat)x
{
    return self.frame.origin.x;
}

- (void)setX:(CGFloat)newX
{
    CGRect newFrame = self.frame;
    newFrame.origin.x = newX;
    self.frame = newFrame;
}

- (CGFloat)y
{
    return self.frame.origin.y;
}

- (void)setY:(CGFloat)newY
{
    CGRect newFrame = self.frame;
    newFrame.origin.y = newY;
    self.frame = newFrame;
}

#pragma mark Frame Size

- (CGFloat)height
{
    return self.frame.size.height;
}

- (void)setHeight:(CGFloat)newHeight
{
    CGRect newFrame = self.frame;
    newFrame.size.height = newHeight;
    self.frame = newFrame;
}

- (CGFloat)width
{
    return self.frame.size.width;
}

- (void)setWidth:(CGFloat)newWidth
{
    CGRect newFrame = self.frame;
    newFrame.size.width = newWidth;
    self.frame = newFrame;
}

#pragma mark Frame Borders

- (CGFloat)left
{
    return self.x;
}

- (void)setLeft:(CGFloat)left
{
    self.x = left;
}

- (CGFloat)right
{
    return self.frame.origin.x + self.frame.size.width;
}

- (void)setRight:(CGFloat)right
{
    self.x = right - self.width;
}

- (CGFloat)top
{
    return self.y;
}

- (void)setTop:(CGFloat)top
{
    self.y = top;
}

- (CGFloat)bottom
{
    return self.frame.origin.y + self.frame.size.height;
}

- (void)setBottom:(CGFloat)bottom
{
    self.y = bottom - self.height;
}

#pragma mark Center Point

#if !IS_IOS_DEVICE
- (CGPoint)center
{
    return CGPointMake(self.left + self.middleX, self.top + self.middleY);
}

- (void)setCenter:(CGPoint)newCenter
{
    self.left = newCenter.x - self.middleX;
    self.top = newCenter.y - self.middleY;
}
#endif

- (CGFloat)centerX
{
    return self.center.x;
}

- (void)setCenterX:(CGFloat)newCenterX
{
    self.center = CGPointMake(newCenterX, self.center.y);
}

- (CGFloat)centerY
{
    return self.center.y;
}

- (void)setCenterY:(CGFloat)newCenterY
{
    self.center = CGPointMake(self.center.x, newCenterY);
}

#pragma mark Middle Point

- (CGPoint)middlePoint
{
    return CGPointMake(self.middleX, self.middleY);
}

- (CGFloat)middleX
{
    return self.width / 2;
}

- (CGFloat)middleY
{
    return self.height / 2;
}

@end

控制器

//
//  ViewController.m
//  HeightModel
//
//  Created by YouXianMing on 15/1/10.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "Model.h"
#import "ModelCell.h"

static NSString *modelCellFlag = @"ModelCell.h";

@interface ViewController ()<UITableViewDataSource, UITableViewDelegate>

@property (nonatomic, strong) UITableView     *tableView;
@property (nonatomic, strong) NSMutableArray  *dataModelArray;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 数据源
    self.dataModelArray = [NSMutableArray array];
    [self.dataModelArray addObject:[[Model alloc] initWithDictionary:@{@"info"   : @"P.K.",
                                                                       @"subInfo": @"逝者如斯,而未尝往也;盈虚者如彼,而卒莫消长也。盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观之,则物与我皆无尽也。",
                                                                       @"details": @""}]];
    [self.dataModelArray addObject:[[Model alloc] initWithDictionary:@{@"info"   : @"YouXianMing",
                                                                       @"subInfo": @"合抱之木,生于毫末;九层之合,起于垒土;千里之行,始于足下。",
                                                                       @"details": @"精简计算UITableView文本高度"}]];
    [self.dataModelArray addObject:[[Model alloc] initWithDictionary:@{@"info"   : @"Q.L.",
                                                                       @"subInfo": @"",
                                                                       @"details": @""}]];
    [self.dataModelArray addObject:[[Model alloc] initWithDictionary:@{@"info"   : @"",
                                                                       @"subInfo": @"",
                                                                       @"details": @"This is a test ok ?"}]];
    [self.dataModelArray addObject:[[Model alloc] initWithDictionary:@{@"info"   : @"",
                                                                       @"subInfo": @"YouXianMing ? iOS ?? ????, ?? ?? ??, ??, ??? ???, ???? ??? ???? ?? ???? ???? ??, ??, ???? ?? ?? ??!",
                                                                       @"details": @""}]];
    [self.dataModelArray addObject:[[Model alloc] initWithDictionary:@{@"info"   : @"遊賢明はiOS開発エンジニア、愛する技術で、生活を愛し、献身、ゲームが好き、好きなものを食べて、美食愛好家、天道酬勤を学ぶことが好きで、信じ!",
                                                                       @"subInfo": @"",
                                                                       @"details": @"YouXianMing copyright."}]];
    [self.dataModelArray addObject:[[Model alloc] initWithDictionary:@{@"info"   : @"????????????????????? iOS ????????????????????????????????????????????????????????????????????????????????????????????????????????????",
                                                                       @"subInfo": @"Nager sage est un ingénieur, le développement de la technologie iOS amour, de l‘amour de la vie, de dévouement, de jouer le jeu, aime manger, c‘est un bon à rien, comme l‘apprentissage, convaincu que Tiandaochouqin!",
                                                                       @"details": @"entwickler, liebe, Leben, liebe, hingabe, Wie Spiele, der Gern Essen, ist ein Nahrungsmittel, Wie Lernen, Davon überzeugt, dass Gott"}]];

    // tableView
    self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds
                                                  style:UITableViewStylePlain];
    self.tableView.delegate   = self;
    self.tableView.dataSource = self;
    [self.tableView registerClass:[ModelCell class] forCellReuseIdentifier:modelCellFlag];
    [self.view addSubview:self.tableView];

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.dataModelArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ModelCell *cell     = [tableView dequeueReusableCellWithIdentifier:modelCellFlag];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    [cell accessData:self.dataModelArray[indexPath.row]];

    return cell;
}

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

    Model *model = self.dataModelArray[indexPath.row];
    return 20 + model.totalHeight;
}

@end

一些需要注意的地方:

时间: 2024-10-19 14:27:05

用Model来计算cell的高度的相关文章

iOS开发总结-UITableView 自定义cell和动态计算cell的高度

UITableView cell自定义头文件: shopCell.h #import <UIKit/UIKit.h> @interface shopCell : UITableViewCell @property (strong, nonatomic)  UIImageView *image;@property (strong, nonatomic)  UILabel *name;@property (strong, nonatomic)  UILabel *itemshop;@propert

iOS不得姐项目--精华模块上拉下拉的注意事项,日期显示,重构子控制器,计算cell的高度(只计算一次),图片帖子的显示

一.上拉下拉注意事项 使用MJRefresh中的上拉控件自动设置透明 当请求下页数据通过page的时候,注意的是上拉加载更多数据失败的问题,下拉加载数据失败了,页数应该还原.或者是请求成功的时候再将页数修改 二.帖子中的日期显示问题(操作日期的两个类的使用) 期望达到的效果:如图 <1>NSDate -- 需要通过NSDateFormatter(日期格式类)将日期转换成相同的格式,才能相互运算,计算出来的时间间隔是以秒数来呈现的. <2>NSCalendar(日历类) -- 通过当

IOS之xib计算cell的高度

1.之前是纯代码计算cell的高度,现在就是在cell里面成创建好了控件的位置,然后需要计算cell的内容的高度,图片的类型是一样的计算方法.先看看cell的布局情况:如图所示: 计算的高度的方式:头像的高度+内容的高度 +(有如图片就加上图片的高度,没有就不加了)= cell高度 这里就是要计算content的高度了,其他的都写死了直接加上就行了,关键就是计算cell如图计算: Demo下载:http://pan.baidu.com/s/1hspqwp2

iOS开发动态计算cell的高度

在iOS开发过程中,我们经常会用到UITableView, 谈到UITableView当然少不了UITableViewCell.那么有时候我们就会有疑惑,怎么样才能让cell的高度根据文字的大小多少,以及照片的高度来动态设计呢? 下面我们来看一下,到底怎么做才能让cell的高度动态变化,让界面看起来更美观协调一些呢? //动态设置cell的高度 + (CGFloat)heightForRowWithModel:(PhotoInfo *)photoInfo { //1.图片的高度 //让图片等比例

iOS8新特性 计算 cell 的高度

http://tutuge.me/2015/08/08/autolayout-example-with-masonry2/ 1.tableview: 自动计算 tableVIew 的 cell 的高度: 1. 创建 tableview 的时候: tableview.rowHeight = UITableViewAutomaticDimension;(自动获取 cell 的高度) 2. 在heightForRowAtIndexPath: 方法中直接返回:UITableViewAutomaticDi

基于Masonry自己主动计算cell的高度

/** * This is a very very helpful category for NSTimer. * * @author huangyibiao * @email [email protected] * @github https://github.com/632840804 * @blog http://blog.csdn.net/woaifen3344 * * @note Make friends with me. * Facebook: [email protected] (

自动调整cell的高度

动态改变UITableView中的Cell高度(转载)     往往在开发iPhone的应用过程中用得最多的应该算是UITableVIew了,凭着IOS给UITableView赋予了这种灵活的框架结构,让它不 管在显示列表方面还是在排版方面都有着一定的优势.虽然UITableView功能强大,但是对于一些复杂的应用需求在开发的过程中会出现一些问题,如动 态改变UITableView显示的Cell高度就是其中之一 其实想要改变UITableView的Cell高度并不难,UITableView带有一

iOS 8:【转】iOS UITextView 输入内容实时更新 cell 的高度

源地址:http://vit0.com/blog/2014/12/25/ios-textview-in-cell/ 这篇文章介绍了在一个动态数据的 table view 中,cell 根据 text view 内容的输入实时改变 cell 和 table view 的高度.自动计算 cell 高度的功能使用 iOS 8 才支持的自适应 cell,如果你还不知道 iOS 8 自适应 cell,可以参看这篇文章:iOS 8 自适应 Cell 先上图,我们最终要实现的效果是这样的: 图 1:实时更新

iOS UITextView 输入内容实时更新cell的高度

先上图,我们最终要实现的效果是这样的:可参考(http://www.cocoachina.com/ios/20141226/10778.html) 图 1:实时更新 cell 高度 实现上面效果的基本原理是: 在 cell 中设置好 text view 的 autolayout,让 cell 可以根据内容自适应大小 text view 中输入内容,根据内容更新 textView 的高度 调用 tableView 的 beginUpdates 和 endUpdates,重新计算 cell 的高度