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

尚妝產品技術刊讀發表於2017-03-07

本文來自尚妝iOS團隊嘉文
發表於尚妝github部落格,歡迎訂閱!

準備:

1.FDTemplateLayoutCell

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

【iOS】Masonry 和 FDTemplateLayoutCell 搭配使用「UITableview 自適應內容高度」
UITableView-FDTemplateLayoutCell

2.Masonry

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

【iOS】Masonry 和 FDTemplateLayoutCell 搭配使用「UITableview 自適應內容高度」
工程目錄


自定義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複製程式碼

執行結果:

【iOS】Masonry 和 FDTemplateLayoutCell 搭配使用「UITableview 自適應內容高度」
執行結果

重點:

【iOS】Masonry 和 FDTemplateLayoutCell 搭配使用「UITableview 自適應內容高度」
自適應內容高度關鍵

複雜檢視:

【iOS】Masonry 和 FDTemplateLayoutCell 搭配使用「UITableview 自適應內容高度」
複雜檢視自適應內容高度

相關文章