1. 程式人生 > >Masonry和FDTemplateLayoutCell搭配使用「UITableview自適應內容高度」

Masonry和FDTemplateLayoutCell搭配使用「UITableview自適應內容高度」

準備:

1.FDTemplateLayoutCell

FDTemplateLayoutCell
UITableView-FDTemplateLayoutCell
2.Masonry

將上述兩個第三方下載後(或者使用Cocoapods)匯入工程,然後建立所需檔案,此時的工程目錄:


工程目錄

自定義UITableView

MyTableViewCell.h 建立Model屬性,用來傳值

#import <UIKit/UIKit.h>
#import "Model.h"
@interface MyTableViewCell
: UITableViewCell
@property (nonatomic, strong)Model *model; @end

MyTableViewCell.m 使用Masonry佈局

#import "MyTableViewCell.h"
#import "Masonry.h"
@implementation MyTableViewCell{
    UILabel *_textLB;
}

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    self
= [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { [self createSubViews]; } return self; } /** * 注意,不管佈局多複雜,一定要有相對於cell.contentView的bottom的約束 */ - (void)createSubViews{ _textLB = [UILabel new]; _textLB.backgroundColor = [UIColor orangeColor]; _textLB.numberOfLines
= 0; [self.contentView addSubview:_textLB]; [_textLB mas_makeConstraints:^(MASConstraintMaker *make) { make.top.left.equalTo(self.contentView).offset(10); make.bottom.right.equalTo(self.contentView).offset(-10); }]; } /** * 賦值 * * @param model ViewController傳遞過來的Model用來賦值 */ - (void)setModel:(Model *)model{ if (_model != model) { _model = model; _textLB.text = [NSString stringWithFormat:@"%@", model.text]; } }

Model資料模型

Model.h 建立資料屬性

#import <Foundation/Foundation.h>
@interface Model : NSObject
@property (nonatomic, copy)NSString *text;
@end

Model.m (使用KVC時,如果程式碼中的key值不存在,會丟擲異常,可以在類中通過重寫它提供下面的這個方法來解決這個問題)

#import "Model.h"
@implementation Model
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{

}
@end

ViewController檢視控制器

ViewController.h

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController

@end

ViewController.m 建立列表檢視,並實現自適應高度

#import "ViewController.h"
#import "MyTableViewCell.h"
#import "Model.h"
#import "UITableView+FDTemplateLayoutCell.h"
@interface ViewController ()<UITableViewDataSource, UITableViewDelegate>

@end

@implementation ViewController{
    NSMutableArray *_allDataArr;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.view.backgroundColor = [UIColor lightGrayColor];
    [self initailData];
    [self createMianViews];
}

- (void)initailData{
    _allDataArr = [NSMutableArray array];

    /**
     *  虛擬資料
     */
    for (NSInteger i = 0; i < 3; i++) {
        Model *model = [Model new];
        model.text = @"在東方世界裡,挑選小公牛到競技場角鬥有一定的程式。每一頭被帶進場地的公牛都要向手持長矛刺它的鬥牛士發起進攻。其勇敢程度是根據它不顧矛刃的刺痛向鬥牛士進攻的次數來認真評定的";
        [_allDataArr addObject:model];
    }
}

- (void)createMianViews{
    UITableView *myTableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
    myTableView.backgroundColor = [UIColor whiteColor];
    myTableView.delegate = self;
    myTableView.dataSource = self;
    myTableView.fd_debugLogEnabled = YES;       //開啟自適應高度debug模式
    [self.view addSubview:myTableView];
    [myTableView registerClass:[MyTableViewCell class] forCellReuseIdentifier:@"cell"];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark -UITableViewDataSource
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    [self setupModelOfCell:cell AtIndexPath:indexPath];
    return cell;
}

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

#pragma mark -UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return [tableView fd_heightForCellWithIdentifier:@"cell" cacheByIndexPath:indexPath configuration:^(id cell) {
        [self setupModelOfCell:cell AtIndexPath:indexPath];
    }];
}

#warning 重點(自適應高度必須實現)
//預載入Cell內容
- (void)setupModelOfCell:(MyTableViewCell *)cell AtIndexPath:(NSIndexPath *)indexPath{
    cell.model = [_allDataArr objectAtIndex:indexPath.row];
}
@end

執行結果:


執行結果

重點:


自適應內容高度關鍵

複雜檢視:


複雜檢視自適應內容高度

文/LuisX(簡書作者)
原文連結:http://www.jianshu.com/p/ca11e0e07de4

投資自己,讓自己升值!