##DAY12 UITableViewCell自定义

#pragma mark -------自定义视图步骤---------

自定义视图步骤:

1)在自定义cell类中,将所有cell要显示的子视图控件都声明成属性

2)重写cell的初始化方法,对内部控件进行布局,frame指定为0(CGRectZero),将控件添加到cell上面进行显示,一定要注意使用self.contentView添加;

//自定义cell内部添加子视图,不能使用self,应该使用self.contentView

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

3)在cell内部,重写layoutSubViews方法(先向父类的此方法发送消息),给定内部控件的具体位置;

4)建立模型类,设置属性、异常处理;

//内部什么都不做,异常处理,解决赋值个数不匹配的问题

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{

if ([key isEqualToString:@"id"]) {

self.ID = value;

}

if ([key isEqualToString:@"description"]) {

self.descriptions = value;

}

}

5)在cell内部导入模型,将模型设置成属性;

6)在cell内部,重写模型属性的setter方法,内部使用模型为内部控件完成赋值;

//在cell内部绑定一个模型属性

//重写模型的setter方法,完成赋值

- (void)setStudent:(Student *)student{

if(_student != student){

[_student release];

_student = [student retain];

}

//为内部控件进行赋值,如果写在里面,当数据相同时,第二个cell就没有被赋值

_headerImageView.image = [UIImage imageNamed:_student.picture];

_nameLabel.text = _student.name;

_genderLabel.text = _student.gender;

_ageLabel.text = _student.age;

}

7)内存管理,自定义cell类,模型类中释放属性。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *reuseIdentifier = @"reuse";

MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuse"];

if (cell == nil) {

cell = [[[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier] autorelease];

}

Student *student = _dataArr[indexPath.row];

cell.student = student;//简化

return cell;

}

#pragma mark ———cell自适应高度———

#define kWidth [[UIScreen mainScreen] bounds].size.width//宏定义会直接替换,类方法中不能使用self.view

#define kImageWidth ((kWidth - 30) / 4)

//求一段文本的显示高度

+ (CGFloat)heightForString:(NSString *)string {

NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont systemFontOfSize:17], NSFontAttributeName, nil];

//下面的方法会根据参考宽度和字体的size计算出一个宽度返回出去,这里的CGSizeMake()中的两个参数,第一个是参考宽度,;第二个参数是返回的最大高度

//kImageWidth 即 (([[UIScreen mainScreen] bounds].size.width-30)/4)宏定义会直接替换,类方法中不能使用self.view

return [string boundingRectWithSize:CGSizeMake(3 * kImageWidth, 1000) options:NSStringDrawingUsesLineFragmentOrigin attributes:diccontext:nil].size.height;

}

//返回cell的高度

+ (CGFloat)cellHeightForStudent:(Student *)student {

return 65 + [BoyTableViewCell heightForString:student.introduce] > 120 ? 65 + [BoyTableViewCell heightForString:student.introduce] : 120 ;

}

- (void)layoutSubviews {

[super layoutSubviews];

CGFloat imageWidth = (kWidth - 30) / 4;

_headerImageView.frame = CGRectMake(10, 5, imageWidth, 110);

_introduceLabel.frame = CGRectMake(20 + imageWidth, 65, 3 * imageWidth, [BoyTableViewCell heightForString:_introduceLabel.text]);

}

#pragma mark ------MyTableViewController.m-------

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

Student *stu = _dataArr[indexPath.row];

if ([stu.sex isEqualToString:@"男"]) {

return [BoyTableViewCell cellHeightForStudent:stu];

}else if([stu.sex isEqualToString:@"女"]){

return  [GirlTableViewCell cellHeightForStudent:stu];

}

return 270;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{}

##DAY12 UITableViewCell自定义的更多相关文章

  1. iOS学习31之UITableVIewCell自定义

    1. 自定义Cell 1> 为什么要自定义Cell UITableView 中系统的Cell共提供了四种默认样式,  分别是: UITableViewCellStyleDefault UITab ...

  2. iOS:UITableViewCell自定义单元格

    UITableViewCell:自定义的单元格,可以在xib中创建单元格,也可以在storyBorad中创建单元格.有四种创建方式 <1>在storyBorad中创建的单元格,它是静态的单 ...

  3. UITableViewCell自定义

    ⼀.⾃定义Cell     UITableView中系统的cell共提供了四种默认样式,分别是: UITableViewCellStyleDefault UITableViewCellStyleVal ...

  4. UITableViewCell 自定义绘制 性能高

    // //  FoodListTableViewCellB.m //  BabyFood // //  Created by zhuang chaoxiao on 16/3/7. //  Copyri ...

  5. 纯代码自定义不等高cell

    数据模型.plist解析这里就不过多赘述. 错误思路之一: 通过在heightForRowAtIndexPath:方法中调用cellForRowAtIndexPath:拿到cell,再拿到cell的子 ...

  6. UITableViewCell Property “icon” cannot be found in forward class object “DJWeiBo”

    UITableViewCell 自定义表格 实体属性不显示错误 Property “icon” cannot be found in forward class object “DJWeiBo”引入实 ...

  7. UITabelViewCell自定义(zhuan)

    很多时候,我们需要自定义UITableView来满足我们的特殊要求.这时候,关于UITableView和cell的自定义和技巧太多了,就需要不断的总结和归纳.   1.添加自定义的Cell.   这个 ...

  8. IOS之UI -- UITableView -- 2 -- 等高的Cell

    内容大纲: 1.纯代码 添加子控件 2.Autolayout纯代码 -- Masonry框架的使用 3.自定义等高的cell -- storyboard的使用(更加简单) 4.静态cell 等高的Ce ...

  9. 关于直接创建视图UITableViewController显示(初学)

    今天渣渣想直接创建一个UITableView视图作为根视图来用结果发现有警告,才明白TableView和view是不能直接作为根视图的,需要放在ViewController上.做个笔记详细了解下. 参 ...

随机推荐

  1. 使用mod_cluster进行apache httpd server和jboss eap 6.1集群配置

    本文简单介绍,使用mod_cluster进行apache httpd server和jboss eap 6.1集群配置.本配置在windows上测试通过,linux下应该是一样的.可能要稍作调整.后面 ...

  2. 自己写一个strcmp函数(C++)

    题目说明: 写一个函数,实现两个字符串的比较.即自己写一个strcmp函数,函数原型为int strcmp( char * p1, char * p2); 设p1指向字符串s1,p2指向字符串s2.要 ...

  3. 函数(jquery)

    <script type="text/javascript"> function makeArray(arg1, arg2){    return [ this, ar ...

  4. Swift 设置navigation左右两侧按钮

    我们以设置右侧按钮为例,左侧方法类似 方法一,直接自定义文字 let item=UIBarButtonItem(title: "分享", style: UIBarButtonIte ...

  5. 《think in python》学习-1

    高能提示:本文大量编程术语与释义,一些释义如有偏差恕不讨论. 纠结学Python 很久了,一年的纠结过程中慢慢的积累了一点对python的认知,但实际语法都未曾接触过,研究backbone的一个例子的 ...

  6. SqlServer mssql 按月统计所有部门

    以订单统计为例,前端展示柱状图(Jquery统计): 表及主要字段描述如下:表名:Orders1.日期CreateTime2.金额Amount3.用户UserID 情况一:根据部门统计某一年每月销量( ...

  7. 多线程11_张孝祥 java5的线程锁技术

    本例子因为两个线程公用同线程中,使用同一个对象,实现了他们公用一把锁,实现了同一个方法的互斥. package locks; /** *会被打乱的效果 */ public class LockTest ...

  8. (转)C#DataTable学习心得

    一.DataSet.DataTable.DataRow.DataColumn 1] 在DataSet中添加DataTable DataSet.Tables.Add(DataTable) 实例: Dat ...

  9. JS倒计时器一只,顺便复习javascript时间相关函数

    window.onload = function(){ var uS = 604800; //后台提供 : 秒 var day=hour=minute=second=0, timer; var dem ...

  10. CentOS下Mysql安装调试

    一.安装   yum安装:yum install -y mysql-server mysql mysql-devel 设置自启动:chkconfig mysqld on 启动MySQL:service ...