IOS开发-15.自定义cell(等高cell)

1.初始化方法(添加子控件)

// 需使用如下初始化方法
// 注意创建的子控件添加到cell的contentView中
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        // 图片
        UIImageView *iconImageView = [[UIImageView alloc] init];
        [self.contentView addSubview:iconImageView];
        self.iconImageView = iconImageView;
        // 标题
        UILabel *titleLabel = [[UILabel alloc] init];
        [self.contentView addSubview:titleLabel];
        self.titleLabel = titleLabel;
    }
    return self;
}
// 通过initWithStyle:创建cell,就不会调用这个方法
//- (instancetype)initWithFrame:(CGRect)frame;(自定义View,纯代码调用)

2.设置子控件的Frame(布局子控件)

/**
 *  在这个方法中计算所有子控件的frame
 */
- (void)layoutSubviews
{
// 一定要先调用父类的此方法,不然会造成一些不可预知的错误
    [super layoutSubviews];
    CGFloat margin = 10;
    CGFloat contentViewW = self.contentView.frame.size.width;
    CGFloat contentViewH = self.contentView.frame.size.height;
    // 1.布局图片
    CGFloat iconX = margin;
    CGFloat iconY = margin;
    CGFloat iconW = 80;
    CGFloat iconH = contentViewH - 2 * iconY;
    self.icon_ImageView.frame = CGRectMake(iconX, iconY, iconW, iconH);
    // 2.布局标题
    CGFloat titleX = iconX + iconW + margin;
    CGFloat titleY = iconY;
    CGFloat titleW = contentViewW - titleX - margin;
    CGFloat titleH = 20;
    self.title_Lable.frame = CGRectMake(titleX, titleY, titleW, titleH);
} 

3.设置子控件的内容

// 一般我们会在cell中拥有一个模型数据属性,通过重写属性的setter方法,设置子控件的内容
- (void)setTg:(ZJTg *)tg
{
    _tg = tg;
    self.icon_ImageView.image = [UIImage imageNamed:tg.icon];
    self.title_Lable.text = tg.title;
}

4.自定义cell的autolayout

  • 可以在初始化方法中设定约束,从而设定控件的frame,可以不用重写layoutSubviews方法
// 需导入第三方Masonry框架
// 创建自定义cell添加子控件的方法initWithStyle(note:子控件要添加到contentView上)
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {

        // 常用的间距
        CGFloat margin = 10;

        CGFloat contentViewW = CGRectGetWidth(self.contentView.frame);
        CGFloat contentViewH = CGRectGetHeight(self.contentView.frame);

        // 1.创建图片视图控件
        UIImageView *icon_ImageView = [[UIImageView alloc] init];
        [self.contentView addSubview:icon_ImageView];
        self.icon_ImageView = icon_ImageView;

        // 1.2设置图片控件的约束
        [icon_ImageView makeConstraints:^(MASConstraintMaker *make) {
//            make.left.equalTo(self.contentView.left).offset(margin);
//            make.top.equalTo(self.contentView.top).offset(margin);
         //可以简化为如下   
            make.top.left.equalTo(self.contentView).offset(margin);
            make.bottom.equalTo(self.contentView.bottom).offset(-margin);
            make.width.equalTo(80);
        }];

        // 2.创建标题控件
        UILabel *title_Lable = [[UILabel alloc] init];
        [self.contentView addSubview:title_Lable];
        self.title_Lable = title_Lable;

        // 2.1设置标题控件的约束
        [title_Lable makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(self.icon_ImageView.right).offset(margin);
            make.height.equalTo(20);
            make.right.equalTo(self.contentView.right).offset(-margin);
            make.top.equalTo(self.icon_ImageView.top);
        }];
        }
    return self;
}

5.通过Xib或SB创建cell

// cell的注册机制,可以省略判断缓存池中若是没有可重用cell,自己创建的过程
- viewDidLoad{
    // 这个方法不会去加载xib文件,因为它是通过alloc 、initWithStyle:..方式创建cell
//    [self.tableView registerClass:[ZJTgCell class] forCellReuseIdentifier:ID];
    // 从Xib中加载cell需调用以下方法,(Xib需要,storyBoard不需要)当缓存池中找不到cell的时候,先根据重用标识从注册这里找,然后再从storyboard中找
    [self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass([ZJTgCell class]) bundle:nil] forCellReuseIdentifier:ID];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值