Cell 高度缓存

2017-04-19  本文已影响19人  ziyouzhe4

把之前做的demo放在这里,以后方便看

cell代码 .h

#import <UIKit/UIKit.h>
#import "DDModel.h"

@interface DDCell : UITableViewCell

@property (nonatomic,strong)DDModel *model;

+ (instancetype)cellWithTableView:(UITableView *)tableView;

@end

cell代码 .m

#import "DDCell.h"

@interface DDCell()

@property (nonatomic,strong)UILabel *first;
@property (nonatomic,strong)UILabel *second;
@property (nonatomic,strong)UILabel *third;

@end

@implementation DDCell

+ (instancetype)cellWithTableView:(UITableView *)tableView{
    
    static NSString *identifier = @"DDCell";
         // 1.缓存中取
     DDCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
         // 2.创建
     if (cell == nil) {
        cell = [[DDCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }
    return cell;
    
}

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    
    if ([super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        [self setupSubviews];
    }
    return self;
}

- (void)setupSubviews{
    
    //创建第一个label
    self.first = [[UILabel alloc] init];
    self.second = [[UILabel alloc] init];
    self.third = [[UILabel alloc] init];
    
    self.first.numberOfLines = 0;
    self.second.numberOfLines = 0;
    self.third.numberOfLines = 0;
    
//    self.first.backgroundColor = [UIColor redColor];
//    self.second.backgroundColor = [UIColor blueColor];
//    self.third.backgroundColor = [UIColor greenColor];
    
    [self addSubview:self.first];
    [self addSubview:self.second];
    [self addSubview:self.third];
    
}

- (void)setModel:(DDModel *)model{
    
    CGFloat margin = 8;
    CGFloat left = 12;
    CGFloat width = [UIScreen mainScreen].bounds.size.width - 2 * left;
    _model = model;
    //计算所用高度,设置frame
        
    // 1111111111
    self.first.text = model.firstContent;
    
    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:model.firstContent];
    UIFont *font = [UIFont systemFontOfSize:18];
    UIColor *color = [UIColor redColor];
    NSRange allRange = [model.firstContent rangeOfString:model.firstContent];
    [attrStr addAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:color} range:allRange];
    
    CGFloat fx = left;
    CGFloat fy = 0;
    
    CGFloat fw = width;
    
    CGSize size = [attrStr boundingRectWithSize:CGSizeMake(fw, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;
    self.first.frame = CGRectMake(fx, fy, fw, size.height);
    // 22222
    self.second.text = model.secondContent;
    NSMutableAttributedString *attrStr2 = [[NSMutableAttributedString alloc] initWithString:model.secondContent];
    NSRange allRange2 = [model.secondContent rangeOfString:model.secondContent];
    [attrStr2 addAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:color} range:allRange2];

    CGFloat sx = left;
    CGFloat sy = fy + size.height + margin;
    CGSize size2 = [attrStr2 boundingRectWithSize:CGSizeMake(fw, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;
    self.second.frame = CGRectMake(sx, sy, fw, size2.height);

    // 33333333

    self.third.text = model.thirdContent;
    NSMutableAttributedString *attrStr3 = [[NSMutableAttributedString alloc] initWithString:model.thirdContent];
    NSRange allRange3 = [model.secondContent rangeOfString:model.thirdContent];
    [attrStr3 addAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:color} range:allRange3];
    
    CGFloat tx = left;
    CGFloat ty = sy + size2.height + margin;
    
    CGSize size3 = [attrStr3 boundingRectWithSize:CGSizeMake(fw, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;
    
    self.third.frame = CGRectMake(tx, ty, fw, size3.height);
    model.cellHeight = size3.height + ty + margin;
    
}

模型 .h

#import <UIKit/UIKit.h>

@interface DDModel : NSObject
@property (nonatomic,strong)NSString *firstContent;
@property (nonatomic,strong)NSString *secondContent;
@property (nonatomic,strong)NSString *thirdContent;
//记录cell高度
@property (nonatomic,assign)CGFloat cellHeight;

@end

Controller 中用法


#import "ViewController.h"
#import "DDModel.h"
#import "DDCell.h"



@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>

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

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.dataArray = [NSMutableArray arrayWithCapacity:100];

    for (int i = 0; i < 100; i++) {
        
        DDModel *model = [[DDModel alloc] init];
        model.firstContent = @"11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
        model.secondContent = @"2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222";
        model.thirdContent = @"3333333333333333333";
        
        [self.dataArray addObject:model];
        
    }
    
    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
    
    [self.view addSubview:self.tableView];
    
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    DDCell *cell = [DDCell cellWithTableView:tableView];
  
    cell.model = self.dataArray[indexPath.row];
    
    return  cell;
    
}

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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    DDModel *model = self.dataArray[indexPath.row];
    return  model.cellHeight;
    
}


上一篇下一篇

猜你喜欢

热点阅读