1. 程式人生 > >自定義等高cell(frame和masonry方式)

自定義等高cell(frame和masonry方式)

程式碼自定義cell方法

  • 程式碼自定義cell(使用frame)
    • 1.建立一個繼承自UITableViewCell的子類,比如WQDealCell
      • 在initWithStyle:reuseIdentifier:方法中
        • 新增子控制元件
        • 設定子控制元件的初始化屬性(比如文字顏色、字型)
      • 在layoutSubviews方法中設定子控制元件的frame
      • 需要提供一個模型屬性,重寫模型的set方法,在這個方法中設定模型資料到子控制元件
    • 2.在控制器中
      • 利用registerClass…方法註冊WQDealCell類
      • 利用重用標識找到cell(如果沒有註冊類,就需要手動建立cell)
      • 給cell傳遞模型資料
      • 也可以將建立獲得cell的程式碼封裝起來(比如cellWithTableView:方法)
#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方法,在這個方法中設定模型資料到子控制元件
    • 2.在控制器中
      • 利用registerClass…方法註冊WQDealCell類
      • 利用重用標識找到cell(如果沒有註冊類,就需要手動建立cell)
      • 給cell傳遞模型資料
      • 也可以將建立獲得cell的程式碼封裝起來(比如cellWithTableView:方法)

//兩個巨集定義一定要在標頭檔案之前,因為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;
}