自定義等高cell(frame和masonry方式)
阿新 • • 發佈:2019-02-06
程式碼自定義cell方法
程式碼自定義cell(使用frame)
- 1.建立一個繼承自UITableViewCell的子類,比如WQDealCell
- 在initWithStyle:reuseIdentifier:方法中
- 新增子控制元件
- 設定子控制元件的初始化屬性(比如文字顏色、字型)
- 在layoutSubviews方法中設定子控制元件的frame
- 需要提供一個模型屬性,重寫模型的set方法,在這個方法中設定模型資料到子控制元件
- 在initWithStyle:reuseIdentifier:方法中
- 2.在控制器中
- 利用registerClass…方法註冊WQDealCell類
- 利用重用標識找到cell(如果沒有註冊類,就需要手動建立cell)
- 給cell傳遞模型資料
- 也可以將建立獲得cell的程式碼封裝起來(比如cellWithTableView:方法)
- 1.建立一個繼承自UITableViewCell的子類,比如WQDealCell
#import <UIKit/UIKit.h>
@class WQdealsData;
@interface WQTableViewCell : UITableViewCell
/**資料模型介面*/
@property (nonatomic, strong) WQdealsData *dealData;
+ (instancetype)tableViewCellWithTableView:(UITableView *)tableView;
@end
#import "WQTableViewCell.h"
#import "WQdealsData.h"
@interface WQTableViewCell ()
/**圖片*/
@property (nonatomic, strong) UIImageView *iconImageView;
/**標題*/
@property (nonatomic, strong) UILabel *titleLabel;
/**價格*/
@property (nonatomic, strong) UILabel *priceLabel;
/**購買人數*/
@property (nonatomic, strong) UILabel *buyCountLabel;
@end
@implementation WQTableViewCell
+ (instancetype)tableViewCellWithTableView:(UITableView *)tableView
{
static NSString *ID = @"deals";
WQTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
// 當使用註冊方法優化cell建立的時候,cell永遠不為nil,不進入該方法
if (cell == nil) {
cell = [[WQTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
}
return cell;
}
// 1.在initWithStyle:reuseIdentifier:方法中新增子控制元件,背景色用於測試新增位置是否正確
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
// 新增imageView
self.iconImageView = [[UIImageView alloc]init];
_iconImageView.backgroundColor = [UIColor redColor];
[self.contentView addSubview:self.iconImageView];
// 新增title
self.titleLabel = [[UILabel alloc]init];
//self.titleLabel.backgroundColor = [UIColor blueColor];
//self.titleLabel.textColor = [UIColor redColor];
[self.contentView addSubview:self.titleLabel];
// 新增price
self.priceLabel = [[UILabel alloc]init];
//self.priceLabel.backgroundColor = [UIColor orangeColor];
self.priceLabel.textColor = [UIColor redColor];
[self.contentView addSubview:self.priceLabel];
// 新增buyCount
self.buyCountLabel = [[UILabel alloc]init];
//self.buyCountLabel.backgroundColor = [UIColor grayColor];
self.buyCountLabel.textColor = [UIColor redColor];
self.buyCountLabel.textAlignment = NSTextAlignmentRight;
[self.contentView addSubview:self.buyCountLabel];
}
return self;
}
// 3,在資料模型介面setter方法中,給控制元件賦值
- (void)setDealData:(WQdealsData *)dealData
{
_dealData = dealData;
self.iconImageView.image = [UIImage imageNamed:_dealData.icon];
self.titleLabel.text = _dealData.title;
self.priceLabel.text = [NSString stringWithFormat:@"%@¥", _dealData.price];
self.buyCountLabel.text = [NSString stringWithFormat:@"%@人已購買", _dealData.buyCount];
}
// 2.在layoutSubviews方法中設定子控制元件的frame
- (void)layoutSubviews
{
[super layoutSubviews];
CGFloat contentW = self.contentView.frame.size.width;
CGFloat contentH = self.contentView.frame.size.height;
CGFloat margin = 10;
// imageView
CGFloat iconX = margin;
CGFloat iconY = margin;
CGFloat iconW = 100;
CGFloat iconH = contentH - margin * 2;
self.iconImageView.frame = CGRectMake(iconX, iconY, iconW, iconH);
// title
CGFloat titleX = CGRectGetMaxX(self.iconImageView.frame) + margin;
CGFloat titleY = margin;
CGFloat titleW = contentW - titleX - margin;
CGFloat titleH = 20;
self.titleLabel.frame = CGRectMake(titleX, titleY, titleW, titleH);
// price
CGFloat priceX = titleX;
CGFloat priceY = margin * 2 + titleH;
CGFloat priceW = 80;
CGFloat priceH = contentH - margin * 3 - titleH;
self.priceLabel.frame = CGRectMake(priceX, priceY, priceW, priceH);
// buyCount
CGFloat buyCountX = CGRectGetMaxX(self.priceLabel.frame);
CGFloat buyCountY = priceY;
CGFloat buyCountW = contentW - buyCountX - margin;
CGFloat buyCountH = priceH;
self.buyCountLabel.frame = CGRectMake(buyCountX, buyCountY, buyCountW, buyCountH);
}
// "WQTableViewController.h" 控制器中建立cell,控制器不需要知道cell具體實現,只建立傳入資料即可
程式碼自定義cell(使用autolayout)
- 1.建立一個繼承自UITableViewCell的子類,比如WQDealCell
- 在initWithStyle:reuseIdentifier:方法中
- 新增子控制元件
- 新增子控制元件的約束(建議使用
Masonry
) - 設定子控制元件的初始化屬性(比如文字顏色、字型)
- 需要提供一個模型屬性,重寫模型的set方法,在這個方法中設定模型資料到子控制元件
- 在initWithStyle:reuseIdentifier:方法中
- 2.在控制器中
- 利用registerClass…方法註冊WQDealCell類
- 利用重用標識找到cell(如果沒有註冊類,就需要手動建立cell)
- 給cell傳遞模型資料
- 也可以將建立獲得cell的程式碼封裝起來(比如cellWithTableView:方法)
- 1.建立一個繼承自UITableViewCell的子類,比如WQDealCell
//兩個巨集定義一定要在標頭檔案之前,因為masonry實現檔案裡需要用到
//define this constant if you want to use Masonry without the 'mas_' prefix
#define MAS_SHORTHAND
//define this constant if you want to enable auto-boxing for default syntax
#define MAS_SHORTHAND_GLOBALS
#import "Masonry.h"
//建立完子控制元件後,直接新增約束
// 1.在initWithStyle:reuseIdentifier:方法中新增子控制元件,背景色用於測試新增位置是否正確
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
CGFloat margin = 10;
// 新增imageView
self.iconImageView = [[UIImageView alloc]init];
[self.contentView addSubview:self.iconImageView];
// 新增約束
[self.iconImageView makeConstraints:^(MASConstraintMaker *make) {
make.top.left.offset(margin);
make.bottom.offset(- margin);
make.width.equalTo(100);
}];
// 新增title
self.titleLabel = [[UILabel alloc]init];
[self.contentView addSubview:self.titleLabel];
// 新增約束
[self.titleLabel makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.iconImageView.right).offset(margin);
make.top.offset(margin);
make.right.offset(- margin);
}];
// 新增price
self.priceLabel = [[UILabel alloc]init];
self.priceLabel.textColor = [UIColor redColor];
[self.contentView addSubview:self.priceLabel];
// 新增約束
[self.priceLabel makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.titleLabel.left);
make.width.equalTo(80);
make.bottom.offset(-margin);
}];
// 新增buyCount
self.buyCountLabel = [[UILabel alloc]init];
self.buyCountLabel.textColor = [UIColor redColor];
self.buyCountLabel.textAlignment = NSTextAlignmentRight;
[self.contentView addSubview:self.buyCountLabel];
// 新增約束
[self.buyCountLabel makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.priceLabel.right).offset(margin);
make.right.equalTo(- margin);
make.bottom.equalTo(self.priceLabel.bottom);
}];
}
return self;
}