##DAY12 UITableViewCell自定义
##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自定义的更多相关文章
- iOS学习31之UITableVIewCell自定义
1. 自定义Cell 1> 为什么要自定义Cell UITableView 中系统的Cell共提供了四种默认样式, 分别是: UITableViewCellStyleDefault UITab ...
- iOS:UITableViewCell自定义单元格
UITableViewCell:自定义的单元格,可以在xib中创建单元格,也可以在storyBorad中创建单元格.有四种创建方式 <1>在storyBorad中创建的单元格,它是静态的单 ...
- UITableViewCell自定义
⼀.⾃定义Cell UITableView中系统的cell共提供了四种默认样式,分别是: UITableViewCellStyleDefault UITableViewCellStyleVal ...
- UITableViewCell 自定义绘制 性能高
// // FoodListTableViewCellB.m // BabyFood // // Created by zhuang chaoxiao on 16/3/7. // Copyri ...
- 纯代码自定义不等高cell
数据模型.plist解析这里就不过多赘述. 错误思路之一: 通过在heightForRowAtIndexPath:方法中调用cellForRowAtIndexPath:拿到cell,再拿到cell的子 ...
- UITableViewCell Property “icon” cannot be found in forward class object “DJWeiBo”
UITableViewCell 自定义表格 实体属性不显示错误 Property “icon” cannot be found in forward class object “DJWeiBo”引入实 ...
- UITabelViewCell自定义(zhuan)
很多时候,我们需要自定义UITableView来满足我们的特殊要求.这时候,关于UITableView和cell的自定义和技巧太多了,就需要不断的总结和归纳. 1.添加自定义的Cell. 这个 ...
- IOS之UI -- UITableView -- 2 -- 等高的Cell
内容大纲: 1.纯代码 添加子控件 2.Autolayout纯代码 -- Masonry框架的使用 3.自定义等高的cell -- storyboard的使用(更加简单) 4.静态cell 等高的Ce ...
- 关于直接创建视图UITableViewController显示(初学)
今天渣渣想直接创建一个UITableView视图作为根视图来用结果发现有警告,才明白TableView和view是不能直接作为根视图的,需要放在ViewController上.做个笔记详细了解下. 参 ...
随机推荐
- Unity插件之NGUI学习(1)—— 环境搭建
Unity官网http://unity3d.com/unity/download下载最新版本号4.5.4 在圣典论坛上找到破解补丁(Windows)版本号tid=18741&fid=8&quo ...
- 高效搭建Spark全然分布式集群
写在前面一: 本文具体总结Spark分布式集群的安装步骤,帮助想要学习Spark的技术爱好者高速搭建Spark的学习研究环境. 写在前面二: 使用软件说明 约定,Spark相关软件存放文件夹:/usr ...
- UINavigationController技巧<一>——修改返回按钮的标题
UINavigationController 一般push到另一界面后,返回按钮标题便是上一页面的title,但是对于push的第一页或者是上一页面没有title的,返回按钮标题便是默认back,如图 ...
- Visual Studio使用技巧
编程部分: 1.TODO:书签 打开之后返回上次工作的位置.让我们不再用脑子去记忆,去回顾刚刚工作到的部分. 操作非常easy.例如以下代码所看到的: public DataTable SelectB ...
- 随滚动条滚动的居中div
<!-- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- javascript高级知识分析——定义函数
代码信息来自于http://ejohn.org/apps/learn/. 可以使用哪些方式来声明函数? function isNimble(){ return true; } var canFly = ...
- 在EL表达式或者Struts标签库中格式化日期对象,即将Date转换为yyyy-MM-dd格式
一.EL表达式 首先,在jsp页面引入<fmt> tags,<%@ taglib prefix="fmt" uri="http://java.sun.c ...
- iOS技术
iOS技术 OC:分类(好处,和延展的区别) 分类: 在不修改原有的类的基础上增加新的方法 一个庞大的类可以分模块开发 一个庞大的类可以由多个人来编写,更有利于团队合作 分类是对原有类的一种扩展,在 ...
- Java 之HashMap.values()方法误用
1.出错 今天在测试代码的时候发现程序报错,看代码才知道是使用HashMap.values()方法的时候出错.因为项目中需要获取Map的值的集合然后进行遍历,所以就很自然的调用了HashMap.val ...
- poj 2771 最大独立集
这道题又无耻的抄袭了别人的代码. 刚开始以为是最大匹配,把条件不相符的人连一起,然后求最大匹配,感觉麻烦,然后看了别人的解题报告,是把相符的人连一起,然后减去,其实就是最大独立集. 最大独立集=|G| ...