##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{}

时间: 2024-08-10 23:18:29

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

UITableViewCell自定义

待完善 UITableViewCell自定义,布布扣,bubuko.com

iOSDay30之UITableVIewCell自定义

1. 自定义Cell 1> 为什么要自定义Cell UITableView 中系统的Cell共提供了四种默认样式,  分别是: UITableViewCellStyleDefault UITableViewCellStyleValue1 UITableViewCellStyleValue2 UITableViewCellStyleSubtitle 但是在实际使用过程中, Cell样式的布局上千差万别, 因此我们需要自定义Cell 在前期我们学过自定义视图, 即创建一个类继承于 UIView 或者

iOS:UITableViewCell自定义单元格

UITableViewCell:自定义的单元格,可以在xib中创建单元格,也可以在storyBorad中创建单元格.有四种创建方式 <1>在storyBorad中创建的单元格,它是静态的单元格,单元格一开始就存在,可以直接根据自定义的重用标识名加载使用: <2>当然,storyBorad中单元格也可以关联一个自定义的类,这个类必须是继承UITableViewCell,这种情况下,直接根据自定义的重用标识名加载使用也是可以的. <3>在xib中创建的单元格,如果直接通过b

Objective-C:UITableViewCell自定义单元格

UITableViewCell:自定义的单元格,可以在xib中创建单元格,也可以在storyBorad中创建单元格.有四种创建方式 <1>在storyBorad中创建的单元格,它是静态的单元格,单元格一开始就存在,可以直接根据自定义的重用标识名加载使用: <2>当然,storyBorad中单元格也可以关联一个自定义的类,这个类必须是继承UITableViewCell,这种情况下,直接根据自定义的重用标识名加载使用也是可以的. <3>在xib中创建的单元格,如果直接通过b

[UITableViewCell] 自定义cell初始化

方法一: 方法一没有讲单元格重用 建的单元格数量少还可以 1.新建一个Swift文件 import UIKit class Custom: UITableViewCell { var label1: UILabel? var label2: UILabel? var label3: UILabel? var label4: UILabel? var label5: UILabel? override func awakeFromNib() { super.awakeFromNib() // In

UITableViewCell自定义分割线

产品设计今天要求cell的分割线不能是整个屏幕的长度,这时候我们有两种方法可以解决 方法一就是自己写一个label放在cell上 方法二就是自定义一个分割线,方法如下 首先我们要去掉cell默认的分割线,设为none [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; 然后实现- (void)drawRect:(CGRect)rect方法 - (void)drawRect:(CGRect)rect{ //首先

ios自定义类(UIView)代码生成简单的UITableViewCell

由于一个项目中有大量的UITableViewCell需要书写,样式差不多都是 文字介绍:显示内容 这样的.自己又懒得写UITableViewCell类嫌没必要:在方法tableView:cellForRowAtIndexPath中手写又繁琐.就封装变化写了一个UIView类. 项目:点击下载 构思:首先由于文字介绍和显示内容的宽度固定,然后Cell的一行(Cell可以包括多行)高度就是文字介绍和显示内容所需要的高度两者相比高一些的.下一行就是高度累加重复:Cell的最上端和最下端给个高度:最下端

纯代码自定义不等高cell

数据模型.plist解析这里就不过多赘述. 错误思路之一: 通过在heightForRowAtIndexPath:方法中调用cellForRowAtIndexPath:拿到cell,再拿到cell的子控件的最大Y值的方法是不可取的.会出现死循环,因为cellForRowAtIndexPath:方法中会调用heightForRowAtIndexPath:方法.错误思路之二: 在layoutSubviews方法中,根据子控件的高度,计算cell的高度.先初始化一个变量为0为cell的高度,计算出来所

【IOS】UITableView样式的自定义

很多时候,我们需要自定义UITableView来满足我们的特殊要求.这时候,关于UITableView和cell的自定义和技巧太多了,就需要不断的总结和归纳. 1.添加自定义的Cell. 这个问题已经涉及过,但是,这里要说的主要是两种方法的比较! 因为,我经常发现有两种方式: 1.xib方式 这种方式,也就是说,为自定义的UITableViewCell类添加一个xib的文件.并且让两者关联. 这时候,写法为: // 返回cell - (UITableViewCell *)tableView:(U