##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. URAL 1796. Amusement Park (math)

    1796. Amusement Park Time limit: 1.0 second Memory limit: 64 MB On a sunny Sunday, a group of childr ...

  2. mount CIFS return ERR -12 and report Cannot allocate memory

    When I mount CIFS on board, it encountered error as below: # mount -t cifs //192.168.1.28/98share /t ...

  3. MAC COCOA call command 调用终端控制台程序

    MAC COCOA call command 调用终端控制台程序 STEP 1 先写一个C++ DOS程序 STEP2 使用NSTask来运行,然后用NSPipe和 NSData来接受运行的结果字符串 ...

  4. 为SharePoint 2010中的FBA创建自定义登录页面

    SharePoint 2010中默认的FBA登录页面非常简单,只提供了一个Asp.Net的Login控件,让用户输入用户名和密码.在大多数情况下,我们需要定制这个页面以满足一些安全需求,比如为登录页面 ...

  5. LINUX下查看CPU使用率的命令[Z]

    1.top 使用权限:所有使用者 使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b] 说明:即时显示process的动态 d :改变显示的更新速度,或 ...

  6. poj1323--贪心算法

    题意:一群人打牌包括你,每人出一张牌,谁最大,谁就算赢一局,问你最少能赢几局? 给出人数N,每人的牌数M,及你的牌. 分析:1.这题需比较大小,就像我们打牌时要将牌排序以便出牌,显然要先将手上的牌进行 ...

  7. Linux下多任务间通信和同步-消息队列

    Linux下多任务间通信和同步-消息队列 嵌入式开发交流群280352802,欢迎加入! 简介 消息队列简称为队列.消息队列就是一些消息的列表.用户可以在消息队列中添加消息和读取消息等.从这点上看,消 ...

  8. Could not find class 'XXX.activity‘', referenced from method 'YYYY'

    Could not find class 'XXX.activity‘', referenced from method 'YYYY'的解决方案: 出现这个错误.是由于eclipse升级ADT所导致的 ...

  9. SQL Server 查看对象的权限

    例子 1. 查看登录名 loginA的权限: create login loginA with password = '123456'; go use studio; create user logi ...

  10. Java HashSet和LinkedHashSet的用法

    Java HashSet和LinkedHashSet的用法 类HashSet和LinkedHashSet都是接口Set的实现,两者都不能保存重复的数据.主要区别是HashSet不保证集合中元素的顺序, ...