⼀、⾃定义Cell
 
 
UITableView中系统的cell共提供了四种默认样式,分别是:
UITableViewCellStyleDefault
UITableViewCellStyleValue1
UITableViewCellStyleValue2
UITableViewCellStyleSubtitle
 
⼆、Model类型对象的使⽤
 
Model类主要是为了给我们提供数据,简单⽽⾔即⾃定义 类且继承于NSObject的称之为Model。⽽继承于UIView的 称之为View类。 
现在我们的数据提供都是存放在数组和字典中,OC中的 KVC就是帮助我们将字典转换为Model类⽽存在的
Model的使用
创建步骤:
• 创建⼀个类并继承于NSObject
• 添加和字典中对应的属性
• 在视图控制器中将字典通过KVC为Model赋值
• 将Model对象添加到数组中并刷新TableView
 
三、多种Cell混合使⽤
 
使用场景
⼀个重⽤标识符只能针对于⼀种Cell样式,不同的Cell需要 基于不同的重⽤标识符来进⾏区分,⽽重⽤标识符的区分需 要根据不同的情况来划分,⽐如:
• model属性划分(不同的数据内容,⽐如⼀个数据中有 type字段,为1代表图⽚类型,为0代表⽂字类型)
Model *model = [self.tableArray
                    objectAtIndex:indexPath.row];
    //根据model属性划分
    if (model.type == 0) {
        FirstTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:firstIdentify];
        return cell;
    }
   
    if (model.type == 1) {
        SecondTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:secondIdentify];
        return cell;
    }
• 固定的⾏显⽰的Cell类型不⼀样
// 第⼀⾏显⽰第⼀种Cell
    if (indexPath.row == 0) {
        FirstTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:firstIdentify];
        return cell;
    }
    // 第⼆⾏显⽰第⼆种Cell
    if (indexPath.row == 1) {
        SecondTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:secondIdentify];
        return cell;
    }
 
四、Cell⾃适应⾼度
 
 
  • 文本自适应高度   根据⽂本内容设定Label⾼度
 
NSString *str = @"《纽约时报》称,尽管双⽅可能会在⽓候变化这样的问题上达成共识,但在中美存在争议的议题上,预计主席不会做出什么让步。这些问题包括⺴络间谍、在南海争议海域填海造岛,以及中国对在其境内经营的外国企业和⾮政府组织加紧了控制。";
// 获得字体样式属性
NSDictionary *att = @{NSFontAttributeName:[UIFont systemFontOfSize:17.0]};
// 根据字体样式属性获得⾼度
CGRect rect = [str boundingRectWithSize:CGSizeMake(200, 10000) options:NSStringDrawingUsesLineFragmentOrigin attributes:att context:nil];
[self.showLabel setFrame:CGRectMake(0, 0, 200, rect.size.height)];
 
  • 图片自适应高度   根据图⽚宽度进⾏等⽐例缩放
UIImage *aImage = [UIImage imageNamed:@"1.png"];
    // 获得图⽚真实⾼度和宽度
    CGFloat height = aImage.size.height;
    CGFloat width = aImage.size.width;
    // 缩放后宽度固定为200
    CGFloat scale = width / 200;
    CGFloat realHeight = height / scale;
    [self.myImageView setFrame:CGRectMake(0,0,200,realHeight)];
 
代码步骤:
//1、自定义cell的第一步,将所有cell要显示的子视图控件声明成属性
@property (nonatomic, retain) UIImageView *headerImageView;//头像
@property (nonatomic, retain) UILabel *nameLabel;//姓名
@property (nonatomic, retain) UILabel *genderLabel;//性别
@property (nonatomic, retain) UILabel *ageLabel;//年龄
 
//2、重写cell的初始化方法,frame给定为0,将控件添加到cell上面进行显示,一定要注意使用self.contentView添加
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        _headerImageView = [[UIImageView alloc] initWithFrame:CGRectZero];
        _headerImageView.backgroundColor = [UIColor orangeColor];
        _nameLabel = [[UILabel alloc] initWithFrame:CGRectZero];
        _nameLabel.backgroundColor = [UIColor yellowColor];
        _genderLabel = [[UILabel alloc] initWithFrame:CGRectZero];
        _genderLabel.backgroundColor = [UIColor cyanColor];
        _ageLabel = [[UILabel alloc] initWithFrame:CGRectZero];
        _ageLabel.backgroundColor = [UIColor purpleColor];
        //自定义cell内部添加子视图, 不能使用self,应该是使用sele.contentView
       
        [self.contentView addSubview:_nameLabel];
        [self.contentView addSubview:_genderLabel];
        [self.contentView addSubview:_ageLabel];
        [self.contentView addSubview:_headerImageView];
    }
    return self;
}
 
//3、重写layoutSubviews方法,给定内部控件的具体位置
- (void)layoutSubviews {
    [super layoutSubviews];
    _headerImageView.frame = CGRectMake(5, 5, 50, 80);
    _nameLabel.frame = CGRectMake(65, 5, 100, 20);
    _genderLabel.frame = CGRectMake(65, 35, 100, 20);
    _ageLabel.frame = CGRectMake(65, 65, 100, 20);
}
 
//4、导入模型,将模型与cell绑定,声明模型属性
//在cell内部绑定一个模型属性
@property (nonatomic, retain) Student *modelStu;
 
//5、重写模型的setter方法,内部使用模型为内部控件赋值
- (void)setModelStu:(Student *)modelStu {
    if (_modelStu != modelStu) {
        [_modelStu release];
        _modelStu = [modelStu retain];
        //为内部控件进行赋值
        _headerImageView.image = [UIImage imageNamed:_modelStu.picture];
        _nameLabel.text = _modelStu.name;
        _genderLabel.text = _modelStu.gender;
        _ageLabel.text = _modelStu.age;
    }
}
 
//求一段文本的显示高度
+ (CGFloat)heightForString:(NSString *)string {
   
    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont systemFontOfSize:17], NSFontAttributeName, nil];
   
    CGRect rect = [string boundingRectWithSize:CGSizeMake(3 *kImageWidth, 1000) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];
   
    return rect.size.height;
}

//返回cell的高度
+ (CGFloat)cellHeightForStudent:(Student *)student {
   
    CGFloat totalHeight = 65 + [BoyTableViewCell heightForString:student.introduce];
   
    return  totalHeight > 120 ? totalHeight : 120;

}
 
//6、内存管理
- (void)dealloc {
    [_nameLabel release];
    [_genderLabel release];
    [_ageLabel release];
    [_headerImageView release];
    [_modelStu release];
    [super dealloc];
}
 
 
//在MyTableViewController.m中
 
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    //先获取模型
    Student *student = _dataArray[indexPath.row];
    if ([student.sex isEqualToString:@"男"]) {
        return [BoyTableViewCell cellHeightForStudent:student];
    } else if ([student.sex isEqualToString:@"女"]) {
        return [GirlTableViewCell cellHeightForStudent:student];
    }
    return 0;
}

UITableViewCell自定义的更多相关文章

  1. ##DAY12 UITableViewCell自定义

    ##DAY12 UITableViewCell自定义 #pragma mark -------自定义视图步骤--------- 自定义视图步骤: 1)在自定义cell类中,将所有cell要显示的子视图 ...

  2. iOS学习31之UITableVIewCell自定义

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

  3. iOS:UITableViewCell自定义单元格

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

  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. opencv的学习笔记2

    继续昨晚的学习总结,昨晚看到轨迹条的创建就没有看下去了,今天继续: 1.轨迹条的创建: 轨迹条往往会和一个回调函数配合使用,当轨迹条发生改变,就调用这个轨迹条的回调函数 int createTrack ...

  2. android混合开发,webview的java与js互操作

    android原生应用,用webview加载应用中的网页,并且java代码与js代码可以互相操作. 这是混合开发的基石,最基本也最重要的东西,实验代码在这里. 概括说说—— java调js:调用web ...

  3. 搭建android开发环境

    任何一个程序的开端都要从搭建开发环境开始,这样你就可以进行实战练习了,并且搭建完后即快速来一个项目HelloWorld, 哈哈,话不多说了,进入正题 android环境的安装主要分3步骤: 1.下载和 ...

  4. [已解决]Eclipse 插件Maven在使用 add dependency,找不到包,解决办法

    以Eclipse版本[Version: Luna Release (4.4.0),]为例, 依次打开:Window >show view > other > Maven Reposi ...

  5. Web_add_header

    如果你发现所有的HTTP send请求都缺少头数据包,在脚本中的开头添加web_add_auto_header(”XXXXX“,”yyyy“);随着web_add_auto_header的添加,你不需 ...

  6. Android动画View Animation

    Animations 一.Animations介绍 Animations是一个实现android UI界面动画效果的API,Animations提供了一系列的动画效果,可以进行旋转.缩放.淡入淡出等, ...

  7. 滚动RollUp、压缩

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. 一键式Spring集成工具 Spring Boot

    最近公司使用Spring boot进行开发,稍微了解一下,不过自我感觉把集中式配置applicate.properties搞明白,注解用过Spring MVC的boot绝对没问题的 比如拦截器:@As ...

  9. Zero Copy

    原文出处: http://www.ibm.com/developerworks/library/j-zerocopy/ 传统的I/O 使用传统的I/O程序读取文件内容, 并写入到另一个文件(或Sock ...

  10. SQL&&LINQ:左(外)连接,右(外)连接,内连接,完全连接,交叉连接,多对多连接

    SQL: 外连接和内连接: 左连接或左外连接:包含左边的表的所有行,如果右边表中的某行没有匹配,该行内容为空(NULL) --outer jion:left join or left outer jo ...