<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont

简介: 第一部分:UItableViewCellAdaptionForHeight: cell的自适应高度第二部分:CustomTableViewCell:自定义cell的混合使用(以简单通讯录为例)========...
第一部分:UItableViewCellAdaptionForHeight : cell的自适应高度
第二部分:CustomTableViewCell:自定义cell的混合使用(以简单通讯录为例)
=================cell的自适应高度====================
AppDelegate.m
#import "NewsController.h"
 self.window.rootViewController = [[[UINavigationController alloc]initWithRootViewController:[NewsController new]]autorelease];
本节所需素材下载: http://pan.baidu.com/s/1bnnwmmj
通讯录素材需要自己整理,涉及到个人隐私不给于提供!
——————————————————————————————
NewsController.m
#import "NewsCell.h"
#define kNewsCell @
"news-cell"
#import
"News.h"

@interface NewsController ()
@property(nonatomic,retain)NSMutableArray *dateSouce;
@end
@implementation NewsController
- (
void)dealloc{
   
self.dateSouce = nil;
    [
super dealloc];
}
- (
void)viewDidLoad {
    [
super viewDidLoad];
   
//配置导航条信息
    [
self configureNavigationControllerBarConten];
   //注册
    [
self.tableView registerClass:[NewsCell class] forCellReuseIdentifier:kNewsCell];
   
//从Plist文件中读取文件
    [self readDataFromPlist];   
}
//从Plist文件中读取文件
- (
void)readDataFromPlist{
   
//获取文件路径
   
NSString *fielPath = [[NSBundle mainBundle]pathForResource:@"NewsData.plist" ofType:nil];
   
//从文件中读取数据,由于文件最外层是字典,所以使用字典接受读取的数据
   
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:fielPath];
//    NSLog(@"%@",dict); 验证
   
NSArray *array = dict[@"news"];
//    NSLog(@"%@",array);
    
   self.dateSouce = [NSMutableArray arrayWithCapacity:0];
    for (NSDictionary *d in array) {
       
//创建model对象
       
News *news = [[News alloc]init];
       
//给news赋值
        [news
setValuesForKeysWithDictionary:d];
       
//把初始化完成的model对象放到数组中
        [
self.dateSouce addObject:news];
        [news release];
    }
//    NSLog(@"%@",self.dateSouce);  验证是否放到数组中
}
//配置导航条信息
- (
void)configureNavigationControllerBarConten{
   
self.navigationController.navigationBar.barTintColor = [UIColor orangeColor];
   
self.navigationItem.title = @"北京新闻";
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
//只需要一个区
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.dateSouce.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  
NewsCell *cell = [tableView dequeueReusableCellWithIdentifier:kNewsCell forIndexPath:indexPath];
   
    [cell
setValueByNews:self.dateSouce[indexPath.row]];
//选中cell的背景颜色
    cell.
selectedBackgroundView = [[UIView alloc]initWithFrame:cell.frame];
    cell.
selectedBackgroundView.backgroundColor = [UIColor greenColor];
   
//取消边框线
    [cell
setBackgroundView:[[UIView alloc]init]];
    cell.
backgroundColor = [UIColor clearColor];
   
   
return cell;
}
//返回行高  此方法要比返回cell的方法先执行,所以在没有返回cell之,就在这里确定cell的高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return [NewsCell cellHeight:self.dateSouce[indexPath.row]];
}
—————————————————————————————————
创建自定义cell
NewsCell.m
@class News ;
@interface NewsCell : UITableViewCell
//写一个方法给cell上的控件赋值
- (
void)setValueByNews : (News *)news;

//定义一个类方法返回cell的行高
//根据传进来的数据,计算当前cell的行高

+ (
CGFloat)cellHeight : (News *)news;

@end
——————————————————————————————————
NewsCell.m
@interface NewsCell ()
@property(nonatomic,retain)UILabel *titleLabel;//标题
@property(nonatomic,retain)UILabel *summaryLabel;//新闻内容
@end
@implementation NewsCell
- (
void)dealloc{
   
self.titleLabel = nil;
   
self.summaryLabel = nil;

    [
super dealloc];
}

- (
id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
   
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
       
        [
self.contentView addSubview:self.titleLabel];
        [self.contentView addSubview:self.summaryLabel];
    }
   
return self;
}

//懒加载方法
//titleLabel 10 10 300 30
- (
UILabel *)titleLabel{
   
if (_titleLabel == nil) {
       
self.titleLabel = [[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 30)]autorelease];
       
self.titleLabel.backgroundColor = [UIColor brownColor];
       
    }
   
return [[_titleLabel retain]autorelease];
}
//summaryLabe 10 50 300 50
- (
UILabel *)summaryLabel{
   
if (_summaryLabel == nil) {
       
self.summaryLabel = [[[UILabel alloc]initWithFrame:CGRectMake(10, 50, 300, 50)]autorelease];
//        self.summaryLabel.backgroundColor = [UIColor yellowColor];
       
//设置文字大小
       
self.summaryLabel.font = [UIFont systemFontOfSize:17.0];
       
//根据内容换行
       self.summaryLabel.numberOfLines = 0;
    }
   
return [[_summaryLabel retain]autorelease];
}
Cell自适应高度及自定义cell混合使用UI_12

 + (CGFloat)summaryLabelheight : (NSString *)summary{
    //参数解释
   1.绘制文本的限制
    2.设置文本高度的标准
    3.设置文字的属性(文字属性中字体的大小要和summaryLabel上设置的文字大小一致)
    4.文本上下文 nil
    //设置文本内容的宽高
   
CGSize contextSize = CGSizeMake(300, 0);
   
   
//设置计算时文本的一些属性,比如:字体的大小
   
NSDictionary *attributes = @{NSFontAttributeName : [UIFont systemFontOfSize:17.0]};
   CGRect summaryRect = [summary boundingRectWithSize:contextSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil];

    return summaryRect.size.height;
}

//根据传进来的数据,计算当前cell的行高
+ (CGFloat)cellHeight : (News *)news{
分析:
    //    return 不可变的高 + 可变的高
   
//不可变的 10 + 30 + 10 + 10
   
//可变的 summaryLabel 的高
   
//计算可变的 summary文本高度
   
CGFloat summartHeight = [self summaryLabelheight:news.summary];
    return 10 + 30 + 10 + 10 + summartHeight;
}

//写一个方法给cell上的控件赋值
- (
void)setValueByNews : (News *)news{
   
self.titleLabel.text = news.title;
   
self.summaryLabel.text = news.summary;
   
   
//赋值完成之后重新计算self.summaryLabel的大小
   
CGRect summaryRect = self.summaryLabel.frame;
   
//修改summaryRect的高
    summaryRect.
size.height = [[self class]summaryLabelheight:news.summary];
   
//将修改后的大小赋值给self.summaryLabel.frame
   self.summaryLabel.frame = summaryRect;
}
——————————————————————————————
创建一个model类继承自NSObject
News.h
@interface News : NSObject
@property(nonatomic,copy)NSString *title;
@property(nonatomic,copy)NSString *summary;
@end
——————————————————————————————
News.m
@implementation News
-(
void)dealloc{
   
self.title = nil;
   
self.summary = nil;
    [
super dealloc];
}
//安全机制,防止未取到key值对应的Value值造成Crash
- (
void)setValue:(id)value forUndefinedKey:(NSString *)key{
   
//可以什么也不写
}
@end
最终效果:
Cell自适应高度及自定义cell混合使用UI_12
——————————————————————————————
=================自定义cell的混合使用===============
AppDelegate.m
    self.window.rootViewController = [[[UINavigationController alloc]initWithRootViewController:[ContactTableViewController new]]autorelease];
ContactTableViewController.m
#import "Person.h"
#import
"BoyCell.h"
#import
"GirlCell.h"
#define kBoyCell @
"boy-cell"
#define kGirlCell @
"girl-cell"

@interface ContactTableViewController ()
@property(nonatomic,retain)NSMutableDictionary *dataSource;//存放所有联系人
@property(nonatomic,retain)NSMutableArray *orderedKeys;//存放排好序的key
@end
@implementation ContactTableViewController
- (
void)dealloc{
   
self.dataSource = nil;
   
self.orderedKeys = nil;
    [
super dealloc];
}
- (
void)viewDidLoad {
    [super viewDidLoad];
    [self costomBar];
   
//读取plist文件
    [
self readDataFromPlist];
   
   
//cell重用新方法的使用步骤:第一步注册cell
   
//第一个参数:提供cell类
   
//第二个参数:提供cell"重用ID"
   
//注册boycell

    [
self.tableView registerClass:[BoyCell class] forCellReuseIdentifier:kBoyCell];
   
//注册gielcell
    [
self.tableView registerClass:[GirlCell class] forCellReuseIdentifier:kGirlCell];
   
//配置cell的行高
   self.tableView.rowHeight = 80.0;
}

- (
void)costomBar{
   
self.navigationController.navigationBar.barTintColor = [UIColor cyanColor];
   self.navigationItem.title = @"联系人";
}

//从plist文件读取数据
- (
void)readDataFromPlist{
   
//获取文件路径
   
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Contacts.plist" ofType:nil];
   
   
//取出文件中的内容
   
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
//    NSLog(@"%@",dict);   验证
   
//初始化联系人字典
   self.dataSource = [NSMutableDictionary dictionaryWithCapacity:0];

    for (NSString *key in dict) {
       
//取出字典中key值对应的数组
       NSArray *group = dict[key];
        //存放初始化的model数据模型Person对象
       
NSMutableArray *mGroup = [NSMutableArray arrayWithCapacity:0];
       
for (NSDictionary *d in group) {
           
//使用字典初始化数据模型Person对象
           
Person *p = [[Person alloc]init];
            [p
setValuesForKeysWithDictionary:d];
           
//将p添加到mGroup数组中
            [mGroup
addObject:p];
            [p
release];
           
        }
       
//将找到的key对应分组下的联系人装到字典中
        [self.dataSource setValue:mGroup forKey:key];
    }
//    NSLog(@"%@",self.dataSource);   验证
   
   
//取出所有的key值并排序
//    NSArray *allkeys = [dict.allKeys sortedArrayUsingSelector:@selector(compare:)];
    //使用排好序的key值数组,初始化self.orderedkeys属性
   self.orderedKeys = [NSMutableArray arrayWithArray:[dict.allKeys sortedArrayUsingSelector:@selector(compare:)]];    
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return self.orderedKeys.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.dataSource[self.orderedKeys[section]] count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   
NSString *key = self.orderedKeys[indexPath.section];
   
//根据key值获取字典中的value值
   
NSMutableArray *group = self.dataSource[key];
   
//根据cell的row下标获取数组中对应的元素
   
Person *person = group[indexPath.row];
   
   
//根据数据模型的model对象储存的数据判断,到底要使用哪一种cell
   
if ([person.gender isEqualToString:@"男"]) {
       
BoyCell *cell = [tableView dequeueReusableCellWithIdentifier:kBoyCell forIndexPath:indexPath];
        cell.
person = person;
       return cell;
    }else{
       
GirlCell *cell = [tableView dequeueReusableCellWithIdentifier:kGirlCell forIndexPath:indexPath];
        [cell
setValueByPerson:person];
       
return cell;
    }
//设置区头
- (
NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
   
return self.orderedKeys[section];
}
—————————————————————————————
建立Person的model
Person.h
@interface Person : NSObject
@property(nonatomic,copy)NSString *name;//姓名
@property(nonatomic,copy)NSString *gender;//姓别
@property(nonatomic,copy)NSString *age;//年龄
@property(nonatomic,copy)NSString *phone;//电话号码
@property(nonatomic,copy)NSString *imageName;//图片
@end
Person.m
- (void)dealloc{
   
self.imageName = nil;
   
self.name = nil;
   
self.age = nil;
   
self.phone = nil;
   
self.gender = nil;
    [
super dealloc];
}

//防止使用字典赋值的时候,没有找到相应的key值Crash
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
}
@end
————————————————————————————
BoyCell.m
#import "BoyCell.h"
#import
"Person.h"

@interface BoyCell ()
@property(nonatomic,retain)UIImageView *photoView;
@property(nonatomic,retain)UILabel *nameLabel;
@property(nonatomic,retain)UILabel *genderLabel;
@property(nonatomic,retain)UILabel
*photoLabel;
@end

@implementation BoyCell
-(
void)dealloc{
   
self.nameLabel = nil;
   
self.photoLabel = nil;
   
self.genderLabel = nil;
   
self.photoView = nil;
   
self.person = nil;
    [
super dealloc];
}

//重写person的setter方法
- (
void)setPerson:(Person *)person{
   
if (_person != person) {
        [
_person release];
       
_person = [person retain];
    }
   
//使用person的属性为cell上的空间赋值
   
self.photoView.image = [UIImage imageNamed:person.imageName];
   
self.nameLabel.text = person.name;
   
self.genderLabel.text = person.gender;
   
self.photoLabel.text = person.phone;
   
}

//图片空间 10  10 60 60
- (
UIImageView *)photoView{
   
if (_photoView == nil) {
       
self.photoView = [[[UIImageView alloc]initWithFrame:CGRectMake(10, 10, 60, 60)]autorelease];
       
self.photoView.backgroundColor = [UIColor yellowColor];
    }
   
return [[_photoView retain]autorelease];
}

//姓名 90 10 60 30
- (
UILabel *)nameLabel{
   
if (_nameLabel == nil) {
       
self.nameLabel = [[[UILabel alloc]initWithFrame:CGRectMake(90, 10, 60, 30)]autorelease];
       
self.nameLabel.backgroundColor = [UIColor redColor];
       
    }
   
return [[_nameLabel retain]autorelease];
}

//性别 170 10 60 30
- (
UILabel *)genderLabel{
   
if (_genderLabel == nil) {
       
self.genderLabel = [[[UILabel alloc]initWithFrame:CGRectMake(170, 10, 60, 30)]autorelease];
       
self.genderLabel.backgroundColor = [UIColor yellowColor];
    }
   
return [[_genderLabel retain]autorelease];
}

//电话 90 50 140 30
- (
UILabel *)photoLabel{
   
if (_photoLabel == nil) {
       
self.photoLabel = [[[UILabel alloc]initWithFrame:CGRectMake(90, 45, 140, 30)]autorelease];
       
self.photoLabel.backgroundColor = [UIColor grayColor];
       
    }
   
return [[_photoLabel retain]autorelease];
}

//重写cell的自定义方法
- (
id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
   
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        [
self.contentView addSubview:self.photoView];
        [
self.contentView addSubview:self.nameLabel];
        [
self.contentView addSubview:self.genderLabel];
        [
self.contentView addSubview:self.photoLabel];
       
    }
   
return self;
}
————————————————————————————————
GirlCell.h
- (void)setValueByPerson : (Person *)person;
GirlCell.m
#import "GirlCell.h"
#import "Person.h"
@interface GirlCell ()
@property(nonatomic,retain)UIImageView *photoView;
@property(nonatomic,retain)UILabel *nameLabel;
@property(nonatomic,retain)UILabel *genderLabel;
@property(nonatomic,retain)UILabel
*phoneLabel;
@end
@implementation GirlCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
   
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        [
self.contentView addSubview:self.photoView];
        [
self.contentView addSubview:self.nameLabel];
        [
self.contentView addSubview:self.genderLabel];
        [
self.contentView addSubview:self.phoneLabel];
    }
   
return self;
}

- (
void)setValueByPerson : (Person *)person;{
   
self.nameLabel.text = person.name;
   
self.phoneLabel.text = person.phone;
   
self.genderLabel.text = person.gender;
   
self.photoView.image = [UIImage imageNamed:person.imageName];
}


//图片 170 10 60 60
- (
UIImageView *)photoView{
   
if (_photoView == nil) {
       
self.photoView = [[[UIImageView alloc]initWithFrame:CGRectMake(170, 10, 60, 60)]autorelease];
       
self.photoView.backgroundColor = [UIColor greenColor];
       
self.photoView.layer.cornerRadius = 30.0;
       
self.photoView.layer.masksToBounds = YES
;
    }
   
return [[_photoView retain]autorelease];
}

//name10 10 60 30
- (
UILabel *)nameLabel{
   
if (_nameLabel == nil) {
       
self.nameLabel = [[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 60, 30)]autorelease];
       
self.nameLabel.backgroundColor = [UIColor yellowColor];
    }
   
return [[_nameLabel retain]autorelease];
}

//姓别 90 10 60 30
- (
UILabel *)genderLabel{
   
if (_genderLabel == nil) {
       
self.genderLabel = [[[UILabel alloc]initWithFrame:CGRectMake(90, 10, 60, 30)]autorelease];
       
self.genderLabel.backgroundColor = [UIColor greenColor];
    }
   
return [[_genderLabel retain ]autorelease];
}

//电话10 50 140 30
- (
UILabel *)phoneLabel{
   
if (_phoneLabel == nil) {
       
self.phoneLabel = [[[UILabel alloc]initWithFrame:CGRectMake(10, 45, 140, 30)]autorelease];
       
self.phoneLabel.backgroundColor = [UIColor redColor];
    }
   
return [[_phoneLabel retain ]autorelease];
}
最终效果:
Cell自适应高度及自定义cell混合使用UI_12

=======================================================
欢迎学习本文,未经博主允许,禁止转载!
目录
相关文章
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
系统的升级涉及各个架构组件,细节很多。常年累月的修修补补使老系统积累了很多问题。 系统升级则意味着需要repair之前埋下的雷,那为何还要升级,可以考虑以下几个方面 成熟老系统常见问题: 1. 缺乏文档(这应该是大小公司都存在的问题。
591 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题。让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region无法split掉,处于不可用状态。
1304 0
|
Web App开发 Linux
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
内存是影响Linux性能的主要因素之一,内存资源的充足与否直接影响应用系统的使用性能。 free命令:监控Linux内存使用状况。
1122 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
hadoop服务器更换硬盘操作步骤(datanode hadoop目录${HADOOP_HOME}/bin    日志位置:/var/log/hadoop)1.登陆服务器,切换到mapred用户,执行jps命令,查看是否有TaskTracker进程。
975 0
|
Web App开发 前端开发 数据库
|
Web App开发 前端开发 大数据
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
一、概述   多维数据模型是最流行的数据仓库的数据模型,多维数据模型最典型的数据模式包括星型模式、雪花模式和事实星座模式,本文以实例方式展示三者的模式和区别。
735 0
|
Web App开发 前端开发 数据库
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
数据仓库建模:定义事实表的粒度Posted on 2015-08-25 09:03 xuzhengzhu 阅读(28) 评论(0) 编辑 收藏 维度建模中一个非常重要的步骤是定义事实表的粒度。
674 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
一个典型的星型模式包括一个大型的事实表和一组逻辑上围绕这个事实表的维度表。  事实表是星型模型的核心,事实表由主键和度量数据两部分组成。
511 0
|
Web App开发 前端开发 大数据
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
打算对新建的hadoop集群使用管理工具,列了以下主要的不同点: 主要的不同点 apache Ambari ClouderaManager Express(免费版) 配置版本控制和历史记录 支...
861 0
|
Web App开发 前端开发 数据库
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
今天在腾讯云上搭的开发环境里的一台机器cpu load飚升老高,然后还能登陆上去,top后发现两个可疑进程、/root/目录下有修改过的文件、/opt目录被干掉了, 后经分析,这台机器上有redis外网服务,/root目录下还有个READ_ME.
981 0