一、storyboard自定义cell

<1>创建一个继承自UITableViewCell的子类,比如ChaosDealCell

<2>在storyboard中

  <2.1>往cell里面增加需要用到的子控件

  <2.2>设置cell的重用标识

  <2.3>设置cell的class为ChaosDealCell

<3>在控制器中

  <3.1>利用重用标识找到cell并且给cell传递模型数据

<4>在ChaosDealCell中

  <4.1>将storyboard中的子控件连线到类扩展中

  <4.2>需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件上

二、Xib自定义cell

<1>创建一个继承自UITableViewCell的子类,比如ChaosDealCell

<2>创建一个xib文件(文件名建议跟cell的类名一样),比如ChaosDealCell.xib

  <2.1>拖拽一个UITableViewCell出来

  <2.2>修改cell的class为ChaosDealCell,,设置cell的重用标识

        

  <2.3>往cell中添加需要用到的子控件

<3>在控制器中,别忘了给cell传递模型数数据

  <方法一:>利用registerNib...方法注册xib文件

 - (void)viewDidLoad {
[super viewDidLoad]; // [self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass([ChaosDealCell class]) bundle:nil] forCellReuseIdentifier:@"deal"];
// 分成两步写
// 1.加载Nib
UINib *nib = [UINib nibWithNibName:NSStringFromClass([ChaosDealCell class]) bundle:[NSBundle mainBundle]];
// 注册cell
[self.tableView registerNib:nib forCellReuseIdentifier:@"deal"];
} 

  <方法二:>利用重用标识找到cell(如果没有注册xib文件,就需要手动加载xib文件)

 // 告诉tableView返回什么样的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 获取对应行的数据
// ChaosDeals *deal = self.deals[indexPath.row]; // 根据tableView从缓存池中拿cell
ChaosDealCell *cell = [tableView dequeueReusableCellWithIdentifier:@"deal"];
if (cell == nil) {
cell = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([ChaosDealCell class]) owner:nil options:nil] lastObject];
}
cell.deal = self.deals[indexPath.row];
return cell;
}

<4>在ChaosDealCell中

  <4.1>将xib中的子控件连线到类扩展中

  <4.2>需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件上

  <4.3>也可以将创建获得cell的代码封装起来(比如cellWithTableView:方法)

 + (instancetype)cellWithTableView:(UITableView *)tableView
{
ChaosDealCell *cell = [tableView dequeueReusableCellWithIdentifier:@"deal"];
if (cell == nil) {
cell = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([ChaosDealCell class]) owner:nil options:nil] lastObject];
}
return cell;
}

三、代码自定义cell(使用frame)

<1>创建一个集成自UITableViewCell的子类,比如ChaosDealCell

  <1.1>在initWithStyle:reuseIdentifier:方法中

  *添加子控件

  *设置子空间的初始化属性(比如文字颜色、字体)

  <1.2>在layoutSubviews方法中设置子控件的frame

  <1.3>需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件

<2>在控制器中

  <2.1>利用registerClass...方法注册ChaosDealCell类

  <2.2>利用重用标识找到cell(如果没有注册类,就需要手动创建cell)

  <2.3>给cell传递模型数据

  <2.4>也可以将创建获得cell的代码封装起来(比如cellWithTableView:方法)

 #import "XMGDealCell.h"
#import "XMGDeal.h" @interface XMGDealCell()
@property (weak, nonatomic) UIImageView *iconView;
@property (weak, nonatomic) UILabel *titleLabel;
@property (weak, nonatomic) UILabel *priceLabel;
@property (weak, nonatomic) UILabel *buyCountLabel;
@end @implementation XMGDealCell + (instancetype)cellWithTableView:(UITableView *)tableView
{
static NSString *ID = @"deal";
// 创建cell
XMGDealCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
// if (cell == nil) {
// cell = [[XMGDealCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
// }
return cell;
} // 1.在initWithStyle:reuseIdentifier:方法中添加子控件 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
UIImageView *iconView = [[UIImageView alloc] init];
[self.contentView addSubview:iconView];
self.iconView = iconView; UILabel *titleLabel = [[UILabel alloc] init];
[self.contentView addSubview:titleLabel];
self.titleLabel = titleLabel; UILabel *priceLabel = [[UILabel alloc] init];
priceLabel.textColor = [UIColor orangeColor];
[self.contentView addSubview:priceLabel];
self.priceLabel = priceLabel; UILabel *buyCountLabel = [[UILabel alloc] init];
buyCountLabel.textAlignment = NSTextAlignmentRight;
buyCountLabel.font = [UIFont systemFontOfSize:];
buyCountLabel.textColor = [UIColor lightGrayColor];
[self.contentView addSubview:buyCountLabel];
self.buyCountLabel = buyCountLabel;
}
return self;
} // 2.在layoutSubviews方法中设置子控件的frame
- (void)layoutSubviews
{
[super layoutSubviews]; CGFloat contentH = self.contentView.frame.size.height;
CGFloat contentW = self.contentView.frame.size.width;
CGFloat margin = ; CGFloat iconX = margin;
CGFloat iconY = margin;
CGFloat iconW = ;
CGFloat iconH = contentH - * iconY;
self.iconView.frame = CGRectMake(iconX, iconY, iconW, iconH); // titleLabel
CGFloat titleX = CGRectGetMaxX(self.iconView.frame) + margin;
CGFloat titleY = iconY;
CGFloat titleW = contentW - titleX - margin;
CGFloat titleH = ;
self.titleLabel.frame = CGRectMake(titleX, titleY, titleW, titleH);
// CGRectMake(titleX, titleY, titleW, titleH); // priceLabel
CGFloat priceX = titleX;
CGFloat priceH = ;
CGFloat priceY = contentH - margin - priceH;
CGFloat priceW = ;
self.priceLabel.frame = CGRectMake(priceX, priceY, priceW, priceH); // buyCountLabel
CGFloat buyCountH = priceH;
CGFloat buyCountY = priceY;
CGFloat buyCountX = CGRectGetMaxX(self.priceLabel.frame) + margin;
CGFloat buyCountW = contentW - buyCountX - margin;
self.buyCountLabel.frame = CGRectMake(buyCountX, buyCountY, buyCountW, buyCountH);
} // 3.重写模型的set方法
- (void)setDeal:(XMGDeal *)deal
{
_deal = deal; // 设置数据
self.iconView.image = [UIImage imageNamed:deal.icon];
self.titleLabel.text = deal.title;
self.priceLabel.text = [NSString stringWithFormat:@"¥%@", deal.price];
self.buyCountLabel.text = [NSString stringWithFormat:@"%@人已购买", deal.buyCount];
} @end

四、代码自定义cell(使用autolayout)

<1>创建一个集成自UITableViewCell的子类,比如ChaosDealCell

  <1.1>在initWithStyle:reuseIdentifier:方法中

  *添加子控件

  *添加子控件的约束(建议使用Masonry)

  *设置子空间的初始化属性(比如文字颜色、字体)

  <1.2>在layoutSubviews方法中设置子控件的frame

  <1.3>需要提供一个模型属性,重写模型的set方法,在这个方法中设置模型数据到子控件

<2>在控制器中

  <2.1>利用registerClass...方法注册ChaosDealCell类

  <2.2>利用重用标识找到cell(如果没有注册类,就需要手动创建cell)

  <2.3>给cell传递模型数据

  <2.4>也可以将创建获得cell的代码封装起来(比如cellWithTableView:方法)

 // 1.在initWithStyle:reuseIdentifier:方法中添加子控件
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
CGFloat margin = ; UIImageView *iconView = [[UIImageView alloc] init];
[self.contentView addSubview:iconView];
self.iconView = iconView;
[iconView makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo();
make.left.top.offset(margin);
make.bottom.offset(-margin);
}]; UILabel *titleLabel = [[UILabel alloc] init];
[self.contentView addSubview:titleLabel];
self.titleLabel = titleLabel;
[titleLabel makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(iconView);
make.left.equalTo(iconView.right).offset(margin);
make.right.offset(-margin);
}]; UILabel *priceLabel = [[UILabel alloc] init];
priceLabel.textColor = [UIColor orangeColor];
[self.contentView addSubview:priceLabel];
self.priceLabel = priceLabel;
[priceLabel makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(titleLabel);
make.bottom.equalTo(iconView);
make.width.equalTo();
}]; UILabel *buyCountLabel = [[UILabel alloc] init];
buyCountLabel.textAlignment = NSTextAlignmentRight;
buyCountLabel.font = [UIFont systemFontOfSize:];
buyCountLabel.textColor = [UIColor lightGrayColor];
[self.contentView addSubview:buyCountLabel];
self.buyCountLabel = buyCountLabel;
[buyCountLabel makeConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(priceLabel);
make.right.equalTo(titleLabel);
make.left.equalTo(priceLabel.right).offset(margin);
}];
}
return self;
}

练习效果图

iOS边练边学--自定义等高的cell的更多相关文章

  1. iOS边练边学--自定义非等高的cell

    一.使用xib或者storyboard自定义非等高的cell实现方式差不多,这里简单介绍一下通过xib文件实现的方法 <1.1>创建一个继承自UITableViewCell的子类,比如Ch ...

  2. iOS开发——UI进阶篇(二)自定义等高cell,xib自定义等高的cell,Autolayout布局子控件,团购案例

    一.纯代码自定义等高cell 首先创建一个继承UITableViewCell的类@interface XMGTgCell : UITableViewCell在该类中依次做一下操作1.添加子控件 - ( ...

  3. iOS-UI控件之UITableView(三)- 自定义不等高的cell

    Storyboard_不等高 对比自定义等高cell,需要几个额外的步骤(iOS8开始才支持) 添加子控件和contentView之间的间距约束 设置tableViewCell的真实行高和估算行高 / ...

  4. iOS-UI控件之UITableView(二)- 自定义不等高的cell

    不等高的cell 给模型增加frame数据 所有子控件的frame cell的高度 @interface XMGStatus : NSObject /**** 文字\图片数据 ****/ // ... ...

  5. iOS边练边学--(Quartz2D)基本图形的绘制#附加自定义进度控件的练习

    一.Quartz2D使用须知 Quartz2D的API是纯C语言的 Quartz2D的API来自于Core Graphics框架 二.<1>通过原始的方法(C语言)绘制简单图形--了解 & ...

  6. iOS边练边学--父子控制器之自定义控制器的切换

    一.如图所示的界面,按钮One.Two.Three分别对应三个控制器的view,点击实现切换.个人感觉父子控制器的重点在于,控制器的view们之间建立了父子关系,控制器不建立的话,发生在view上面的 ...

  7. iOS边练边学--CALayer,非根层隐式动画,钟表练习

    一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性 ...

  8. iOS边练边学--应用数据存储的常用方式(plist,Preference,NSKeyedArchiver)其中的三种

    iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core D ...

  9. iOS边练边学--Http网络再学习,简单介绍

    一.URL 什么是URL URL中常见的协议 二.Http Http的基本通信过程 发送Http请求的方法 GET 和 POST 对比 GET 和 POST 的选择 三.iOS中的Http学习 iOS ...

随机推荐

  1. android离线地图源码

    最近一直在玩Android手机,当然也忘不了在这个平台下搞些和地图相关的东西. Android手机自带了Google的地图软件,不过原来不支持离线浏览,所以很费流量,5.0版本以后可以支持离线浏览,需 ...

  2. Qt WebView改造成 QML App

    这是去年的一个项目,虽然研究出来了,解了一时之需,但随后束之高阁.当时Qt的版本是4.8.现在整理如下: 把QT HTML5 APP改造成 QML App 方案 新建一个QML自定义控件,该控件包含Q ...

  3. Android 弹出有确认按键的对话

    //弹出对话框-------------------------------------------------- private void openDialog(String strMsg, Str ...

  4. 线程的属性和 线程特定数据 Thread-specific Data

    一.posix 线程属性 POSIX 线程库定义了线程属性对象 pthread_attr_t ,它封装了线程的创建者可以访问和修改的线程属性.主要包括如下属性: 1. 作用域(scope) 2. 栈尺 ...

  5. Linux内核同步 - 原子操作

    一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个位于memory中的变量的值到寄存器中 2.修改该变量的值(也就是修改寄存器中的值) 3.将寄存器中的数值写回memory中的变量值 如果这 ...

  6. sliverlight资源文件的URI调用

    这里主要介绍三种方式:1.将文件编译进dll:2.打包在XAP中:3.放在XAP包外,其所在目录下. 这里就将三张图片以不同的方式调用来作为例子: 一.编译进DLL 默认情况下,复制到项目中的资源都是 ...

  7. 为debian8.2更换官方源

    最近,配置一个韩国vps,里面用的是163的源,感觉不如官方的好用,就改为官方源.地址为:ftp.cn.debian.org 输入命令: vi /etc/apt/sources.list 进入vi编辑 ...

  8. ISE约束文件*.ucf的写法

    之前一直相不明白,为什么从官网下载的AC97的IP不能跑起来,整个IP就像空壳一样,bit_clk输进去,没有任何信号输出来.从IP的RTL来看,即使是IP不连到CPU的BUS上,只要是综合进FPGA ...

  9. 【Android】5.5 状态切换(Switch)和评级条(RatingBar)

    分类:C#.Android.VS2015: 创建日期:2016-02-07 一.简介 1.利用Switch或者ToggleButton切换状态 如果只有两种状态,可以用ToggleButton控件或S ...

  10. 基于jQuery+ashx+.net实现三级栏目联动操作

    父级ID可以为空以两个编号为一级 可以添加到第四级 table 字段有ID. name .parentNode. childNode等基本属性  selecet  parentNode  ,len(c ...