首页 > 代码库 > iOS开发UI篇—以微博界面为例使用纯代码自定义cell程序编码全过程(三·完结)

iOS开发UI篇—以微博界面为例使用纯代码自定义cell程序编码全过程(三·完结)

一、需要改进的地方

还需改进的地方:cell的高度需要根据每条微博的数据进行动态设置。
设置cell的高度可以有两种方式,一种是通过rowheight属性来进行设置,一种是通过代理来进行设置。通过属性设置适用于每行的高度一致,使用代理适用于每行的高度不一致的情况。
二、实现思路
在这个应用中,每个cell的高度是根据内容来确定的,所以在这里我们通过代理来设置cell的高度。
获取到图片最大的Y值或者是文字最大的Y值,在cell中设置一个新的变量。
判断一下,如果有配图,则高度等于配图的高度+间隙的高度,如果没有配图那么高度等于文字的高度+间隙的高度。
在自定义cell的setting frame方法中计算出行高,而要在主控制器中进行使用,怎么办才能拿到数据?
 
计算行高的方法最终是由cellforrow(setweibo->settingframe->计算行高)调用的,如果要拿到行高的话,需要先调用cellforrow这个方法。
查看cellforrow和heughtforrow这两个方法是谁先调用,结果显示是heiforrow先调用。
拿不到计算的行高?怎么办?
 
让它在计算heightforrow之前就计算出行高。计算行高,依赖于其他控件中的位置,位置依赖于模型中的数据。
拿到模型数据,就可以计算出高度。
那么在哪里可以拿到数据模型呢?
 
在懒加载中创建模型,就可以拿到模型,计算所有控件的frame,在懒加载中就可以获得行高。
拿到模型后可以计算出5个frame,那么就使用一个模型,把着5个frame保存起来,将来一个自定义的cell就对应一个frame模型。
新建一个类,继承自nsobject,这个类专门用来保存每一行数据的frame。在类中创建5个对应的frame属性,(CGRECT)以及一个行高。添加一个模型数据,当别人给我一个模型数据的时候,我就可以通过重写set方法,设置模型数据的frame.
把之前的frame计算方法拷贝过去。(为什么?)
在懒加载方法中,根据模型数据创建frame模型,往数组里面添加的时候添加frame模型,此时该数组中既有所有的数据模型,又拥有对应的frame。
在代理方法中,获取到当前索引对应的frame。
三、实现代码
1.项目文件结构
2.代码
模型部分
YYweiboModel.h文件
 1 // 2 //  YYweiboModel.h 3 //  微博基本信息展示 4 // 5 //  Created by 孔医己 on 14-6-2. 6 //  Copyright (c) 2014年 itcast. All rights reserved. 7 // 8  9 #import <Foundation/Foundation.h>10 11 @interface YYweiboModel : NSObject12 /**13  *  昵称14  */15 @property(nonatomic,copy)NSString *name;16 /**17  *  正文18  */19 @property(nonatomic,copy)NSString *text;20 /**21  *  头像22  */23 @property(nonatomic,copy)NSString *icon;24 /**25  *  配图26  */27 @property(nonatomic,copy)NSString *picture;28 /**29  *  是否是vip30  */31 @property(nonatomic,assign)BOOL vip;32 33 //接口34 -(instancetype)initWithDict:(NSDictionary *)dict;35 +(instancetype)weiboModelWithDict:(NSDictionary *)dict;36 @end

YYweiboModel.m文件

 1 // 2 //  YYweiboModel.m 3 //  微博基本信息展示 4 // 5 //  Created by 孔医己 on 14-6-2. 6 //  Copyright (c) 2014年 itcast. All rights reserved. 7 // 8  9 #import "YYweiboModel.h"10 11 @implementation YYweiboModel12 13 -(instancetype)initWithDict:(NSDictionary *)dict14 {15     if (self = [super init]) {16         //使用KVC17         [self setValuesForKeysWithDictionary:dict];18     }19     return self;20 }21 22 /**23  *  工厂方法24  *25  *  @param dict 字典26  *27  *  @return 模型28  */29 +(instancetype)weiboModelWithDict:(NSDictionary *)dict30 {31     return [[self alloc]initWithDict:dict];32 }33 @end
视图部分
YYweiboCell.h文件
 1 // 2 //  YYweiboCell.h 3 //  微博基本信息展示 4 // 5 //  Created by 孔医己 on 14-6-2. 6 //  Copyright (c) 2014年 itcast. All rights reserved. 7 // 8  9 #import <UIKit/UIKit.h>10 11 @class YYweiboModel;12 @interface YYweiboCell : UITableViewCell13 14 15 @property(nonatomic,strong)YYweiboModel *weibo;16 @end

YYweiboCell.m文件

  1 //  2 //  YYweiboCell.m  3 //  微博基本信息展示  4 //  5 //  Created by 孔医己 on 14-6-2.  6 //  Copyright (c) 2014年 itcast. All rights reserved.  7 //  8   9 #import "YYweiboCell.h" 10 #import "YYweiboModel.h" 11  12 #define YYNameFont [UIFont systemFontOfSize:15] 13 #define YYTextFont [UIFont systemFontOfSize:16] 14  15 @interface YYweiboCell() 16 /** 17  *  头像 18  */ 19 @property(nonatomic,weak)UIImageView *iconView; 20 /** 21  *  vip图标 22  */ 23 @property(nonatomic,weak)UIImageView *vipView; 24 /** 25  *  微博昵称 26  */ 27 @property(nonatomic,weak)UILabel *nameLabel; 28 /** 29  *  配图 30  */ 31 @property(nonatomic,weak)UIImageView *pictureView; 32 /** 33  *  正文 34  */ 35 @property(nonatomic,weak)UILabel *textLab; 36  37 @end 38  39 @implementation YYweiboCell 40  41 //重写构造方法,让自定义的cell一创建出来就有五个子控件 42 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 43 { 44     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 45     if (self) { 46         //1.添加头像 47         UIImageView *img=[[UIImageView alloc]init]; 48         [self.contentView addSubview:img]; 49         self.iconView=img; 50          51         //2.添加昵称 52         UILabel *namelab=[[UILabel alloc]init]; 53         //在创建昵称的时候就要告诉它,将来要用15号字体显示 54         namelab.font=YYNameFont; 55         [self.contentView addSubview:namelab]; 56         self.nameLabel=namelab; 57          58         //3.vip 59         UIImageView  *vipview=[[UIImageView alloc]init]; 60         vipview.image=[UIImage imageNamed:@"vip"]; 61         [self.contentView addSubview:vipview]; 62         self.vipView=vipview; 63       64         //4.正文 65         UILabel *textlab=[[UILabel alloc]init]; 66         //在创建正文的时候就要告诉它,将来要用16号字体显示 67         textlab.font=YYTextFont; 68         //设置正文在进行显示的时候进行换行 69         textlab.numberOfLines=0; 70         [self.contentView addSubview:textlab]; 71         self.textLab=textlab; 72          73         //5.图片 74         UIImageView *picture=[[UIImageView alloc]init]; 75         [self.contentView addSubview:picture]; 76         self.pictureView=picture; 77     } 78     return self; 79 } 80  81 /** 82  *  重写set方法 83  * 84  *  @param weibo 微博 85  */ 86 -(void)setWeibo:(YYweiboModel *)weibo 87 { 88     //不要忘了,记录传递进来的模型 89     _weibo=weibo; 90     //给子控件赋值数据 91     [self settingData]; 92     //设置子控件的frame 93     [self settingFrame]; 94 } 95  96 /** 97  *  对子控件的数据进行设置 98  */ 99 -(void)settingData100 {101     //1.设置头像的数据102     self.iconView.image=[UIImage imageNamed:_weibo.icon];103     104     //2.设置vip图标的数据105     //判断是否是vip,如果是那么就显示图标,并把字体设置为红色106     //注意这里的判断107     if (_weibo.vip) {108         self.vipView.hidden=NO;109 //        [self.textLab setTintColor:[UIColor redColor]];110         self.nameLabel.textColor=[UIColor redColor];111     }else112     {113         self.vipView.hidden=YES;114         self.nameLabel.textColor=[UIColor blackColor];115     }116 117     118     //所以的vip图标都是一样的,没有必要每次都设置,只需要在构造方法中设置一次就可以了。119    // self.vipView.image=[UIImage imageNamed:@"vip"];120     121     //3.设置正文内容的数据122     self.textLab.text=_weibo.text;123     124     //4.设置配图的数据125     self.pictureView.image=[UIImage imageNamed:_weibo.picture];126     127     //5.设置微博昵称数据128     self.nameLabel.text=_weibo.name;129 }130 131 132 /**133  *  设置子控件的Frame134  */135 -(void)settingFrame136 {137     //1.设置头像的frame138     CGFloat padding=10;139     CGFloat iconViewX=padding;140     CGFloat iconViewY=padding;141     CGFloat iconViewW=30;142     CGFloat iconViewH=30;143     144     self.iconView.frame=CGRectMake(iconViewX, iconViewY, iconViewW, iconViewH);145     146     //2.设置微博昵称的frame147     //昵称的X值=头像的最大的x值+padding148     CGFloat nameLabelX=CGRectGetMaxX(self.iconView.frame)+padding;149     CGSize nameSize=[self sizeWithString:_weibo.name font:YYNameFont maxSize:CGSizeMake(MAXFLOAT,MAXFLOAT)];150     //昵称的Y值=(头像高度-整个文本字体的高度)*0.5+头像的Y值151     CGFloat nameLableY=(iconViewH-nameSize.height)*0.5+iconViewY;152     self.nameLabel.frame=CGRectMake(nameLabelX, nameLableY, nameSize.width, nameSize.height);153     154     //3.设置vip图标的frame155     //vip图标的x值=昵称的最大x值+间隙156     CGFloat vipX=CGRectGetMaxX(self.nameLabel.frame)+padding;157     CGFloat vipY=nameLableY;158     CGFloat vipW=14;159     CGFloat vipH=14;160     self.vipView.frame=CGRectMake(vipX, vipY, vipW, vipH);161     162     //4.设置正文的frame163     CGFloat textLabX=iconViewX;164     CGFloat textLabY=CGRectGetMaxY(self.iconView.frame)+padding;165     CGSize textSize=[self sizeWithString:_weibo.text font:YYTextFont maxSize:CGSizeMake(300,MAXFLOAT)];166     self.textLab.frame=CGRectMake(textLabX, textLabY, textSize.width, textSize.height);167     168     //5.设置配图的frame169     //添加一个变量,来计算行高170     CGFloat cellHight=0;171     //如果有配图,则行高=配图最大的Y值+padding172     //如果没有配图,则行高=文本最大的Y值+padding173     if (_weibo.picture) {174         CGFloat pictureX=iconViewX;175         CGFloat pictureY=CGRectGetMaxY(self.textLab.frame)+padding;176         CGFloat pictureW=100;177         CGFloat pictureH=100;178         self.pictureView.frame=CGRectMake(pictureX, pictureY, pictureW, pictureH);179         cellHight=CGRectGetMaxY(self.pictureView.frame)+padding;180     }else181         cellHight=CGRectGetMaxY(self.textLab.frame)+padding;182 }183 184 185 /**186  *  计算文本的宽高187  *188  *  @param str     需要计算的文本189  *  @param font    文本显示的字体190  *  @param maxSize 文本显示的范围191  *192  *  @return 文本占用的真实宽高193  */194 - (CGSize)sizeWithString:(NSString *)str font:(UIFont *)font maxSize:(CGSize)maxSize195 {196     NSDictionary *dict = @{NSFontAttributeName : font};197     // 如果将来计算的文字的范围超出了指定的范围,返回的就是指定的范围198     // 如果将来计算的文字的范围小于指定的范围, 返回的就是真实的范围199     CGSize size =  [str boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size;200     return size;201 }202 @end

YYweiboFrame.h文件

 1 // 2 //  YYweiboFrame.h 3 //  微博基本信息展示 4 // 5 //  Created by 孔医己 on 14-6-5. 6 //  Copyright (c) 2014年 itcast. All rights reserved. 7 // 8  9 #import <Foundation/Foundation.h>10 #import "YYweiboModel.h"11 12 @interface YYweiboFrame : NSObject13 /**14  *  头像的frame15  */16 @property(nonatomic,assign)CGRect iconF;17 /**18  *  vip图标的frame19  */20 @property(nonatomic,assign)CGRect vipF;21 /**22  *  微博昵称的frame23  */24 @property(nonatomic,assign)CGRect nameF;25 /**26  *  配图的frame27  */28 @property(nonatomic,assign)CGRect pictureF;29 /**30  *  正文的frame31  */32 @property(nonatomic,assign)CGRect textF;33 /**34  *  行高35  */36 @property(nonatomic,assign)CGFloat cellHight;37 38 /**39  *  设置一个YYweiboModel型的属性,用来接收模型40  */41 42 @property(nonatomic,strong)YYweiboModel *weibo;43 44 @end

YYweiboFrame.m文件

 1 // 2 //  YYweiboFrame.m 3 //  微博基本信息展示 4 // 5 //  Created by 孔医己 on 14-6-5. 6 //  Copyright (c) 2014年 itcast. All rights reserved. 7 // 8  9 #import "YYweiboFrame.h"10 #import "YYweiboModel.h"11 12 #define YYNameFont [UIFont systemFontOfSize:15]13 #define YYTextFont [UIFont systemFontOfSize:16]14 15 16 @implementation YYweiboFrame17 18 /**19  *  重写weibo的set方法,设置模型数据的frame属性20  */21 -(void)setWeibo:(YYweiboModel *)weibo22 {23     _weibo=weibo;24     25         //1.设置头像的frame26     CGFloat padding=10;27     CGFloat iconViewX=padding;28     CGFloat iconViewY=padding;29     CGFloat iconViewW=30;30     CGFloat iconViewH=30;31     32     self.iconF=CGRectMake(iconViewX, iconViewY, iconViewW, iconViewH);33     34     //2.设置微博昵称的frame35     //昵称的X值=头像的最大的x值+padding36     CGFloat nameLabelX=CGRectGetMaxX(self.iconF)+padding;37     CGSize nameSize=[self sizeWithString:_weibo.name font:YYNameFont maxSize:CGSizeMake(MAXFLOAT,MAXFLOAT)];38     //昵称的Y值=(头像高度-整个文本字体的高度)*0.5+头像的Y值39     CGFloat nameLableY=(iconViewH-nameSize.height)*0.5+iconViewY;40     self.nameF=CGRectMake(nameLabelX, nameLableY, nameSize.width, nameSize.height);41     42     //3.设置vip图标的frame43     //vip图标的x值=昵称的最大x值+间隙44     CGFloat vipX=CGRectGetMaxX(self.nameF)+padding;45     CGFloat vipY=nameLableY;46     CGFloat vipW=14;47     CGFloat vipH=14;48     self.vipF=CGRectMake(vipX, vipY, vipW, vipH);49     50     //4.设置正文的frame51     CGFloat textLabX=iconViewX;52     CGFloat textLabY=CGRectGetMaxY(self.iconF)+padding;53     CGSize textSize=[self sizeWithString:_weibo.text font:YYTextFont maxSize:CGSizeMake(300,MAXFLOAT)];54     self.textF=CGRectMake(textLabX, textLabY, textSize.width, textSize.height);55     56     //5.设置配图的frame57     //添加一个变量,来计算行高58     //CGFloat cellHight=0;59     //如果有配图,则行高=配图最大的Y值+padding60     //如果没有配图,则行高=文本最大的Y值+padding61     if (_weibo.picture) {62         CGFloat pictureX=iconViewX;63         CGFloat pictureY=CGRectGetMaxY(self.textF)+padding;64         CGFloat pictureW=100;65         CGFloat pictureH=100;66         self.pictureF=CGRectMake(pictureX, pictureY, pictureW, pictureH);67         self.cellHight=CGRectGetMaxY(self.pictureF)+padding;68     }else69         self.cellHight=CGRectGetMaxY(self.textF)+padding;70 }71 72 73 /**74  *  计算文本的宽高75  *76  *  @param str     需要计算的文本77  *  @param font    文本显示的字体78  *  @param maxSize 文本显示的范围79  *80  *  @return 文本占用的真实宽高81  */82 - (CGSize)sizeWithString:(NSString *)str font:(UIFont *)font maxSize:(CGSize)maxSize83 {84     NSDictionary *dict = @{NSFontAttributeName : font};85     // 如果将来计算的文字的范围超出了指定的范围,返回的就是指定的范围86     // 如果将来计算的文字的范围小于指定的范围, 返回的就是真实的范围87     CGSize size =  [str boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size;88     return size;89 }90 @end
控制器部分
YYViewController.h文件
 1 // 2 //  YYViewController.h 3 //  微博基本信息展示 4 // 5 //  Created by 孔医己 on 14-6-2. 6 //  Copyright (c) 2014年 itcast. All rights reserved. 7 // 8  9 #import <UIKit/UIKit.h>10 11 @interface YYViewController : UITableViewController12 13 @end

YYViewController.m文件

 1 // 2 //  YYViewController.m 3 //  微博基本信息展示 4 // 5 //  Created by 孔医己 on 14-6-2. 6 //  Copyright (c) 2014年 itcast. All rights reserved. 7 // 8  9 #import "YYViewController.h"10 #import "YYweiboModel.h"11 #import "YYweiboCell.h"12 #import "YYweiboFrame.h"13 14 @interface YYViewController ()15 @property(nonatomic,strong)NSArray *weibos;16 17 @end18 19 @implementation YYViewController20 21 - (void)viewDidLoad22 {23     [super viewDidLoad];24 }25 26 #pragma mark -懒加载27 -(NSArray *)weibos28 {29     if (_weibos==Nil) {30         NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"statuses.plist" ofType:nil];31         NSArray *arrayM=[NSArray arrayWithContentsOfFile:fullpath];32         33         NSMutableArray *models=[NSMutableArray arrayWithCapacity:arrayM.count];34         for (NSDictionary *dict in arrayM) {35             YYweiboModel *weibomodel=[YYweiboModel weiboModelWithDict:dict];36             //创建一个新的模型37             YYweiboFrame *weiboframe=[[YYweiboFrame alloc]init];38             //接收到数据模型39             weiboframe.weibo=weibomodel;40             41             [models addObject:weiboframe];42         }43         _weibos=[models copy];44     }45     return _weibos;46 }47 48 #pragma mark- 数据源方法49 //返回多少组50 //这里可以不写,默认返回一组51 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView52 {53     return 1;54 }55 //每组多少行56 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section57 {58     return self.weibos.count;59 }60 //每组每行的数据-设置cell61 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath62 {63     //1.到缓存中去取cell64     static NSString *ID=@"ID";65      //2.没有则创建cell66     YYweiboCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];67     if (cell==nil) {68         cell=[[YYweiboCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];69     }70    71     //3.设置cell的数据72     YYweiboFrame *weiboframe=self.weibos[indexPath.row];73     cell.weibo=weiboframe.weibo;74     //4.返回cell75     return cell;76     77 }78 79 #pragma mark-设置每一组的高度80 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath81 {82     //获取当前索引的frame和数据83     YYweiboFrame *weiboframe=self.weibos[indexPath.row];84     //返回每行的行高85     return weiboframe.cellHight;86 }87 #pragma mark- 隐藏状态栏88 -(BOOL)prefersStatusBarHidden89 {90     return YES;91 }92 @end

3.实现效果

       

四、优化

在给自定义cell中重写set方法时,设置了微博的数据,还同时设置了frame,那么既然已经在frame模型中计算出了frame,这里就不需要再进行一次多余的计算了。修改代码,在cell里拿到weiboframe模型,就能拿到所有的frame。在自定义的cell里边,不再保存weibo而是保存weiboframe的属性。

 

说明:只对项目的三个文件进行了修改。

优化后的代码如下:

YYweiboCell.h文件

 1 // 2 //  YYweiboCell.h 3 //  微博基本信息展示 4 // 5 //  Created by 孔医己 on 14-6-2. 6 //  Copyright (c) 2014年 itcast. All rights reserved. 7 // 8  9 #import <UIKit/UIKit.h>10 11 @class YYweiboModel,YYweiboFrame;12 @interface YYweiboCell : UITableViewCell13 14 15 //@property(nonatomic,strong)YYweiboModel *weibo;16 @property(nonatomic,strong)YYweiboFrame *weiboframe;17 @end

YYweiboCell.m文件

  1 //  2 //  YYweiboCell.m  3 //  微博基本信息展示  4 //  5 //  Created by 孔医己 on 14-6-2.  6 //  Copyright (c) 2014年 itcast. All rights reserved.  7 //  8   9 #import "YYweiboCell.h" 10 #import "YYweiboModel.h" 11 #import "YYweiboFrame.h" 12  13 #define YYNameFont [UIFont systemFontOfSize:15] 14 #define YYTextFont [UIFont systemFontOfSize:16] 15  16 @interface YYweiboCell() 17 /** 18  *  头像 19  */ 20 @property(nonatomic,weak)UIImageView *iconView; 21 /** 22  *  vip图标 23  */ 24 @property(nonatomic,weak)UIImageView *vipView; 25 /** 26  *  微博昵称 27  */ 28 @property(nonatomic,weak)UILabel *nameLabel; 29 /** 30  *  配图 31  */ 32 @property(nonatomic,weak)UIImageView *pictureView; 33 /** 34  *  正文 35  */ 36 @property(nonatomic,weak)UILabel *textLab; 37  38 @end 39  40 @implementation YYweiboCell 41  42 //重写构造方法,让自定义的cell一创建出来就有五个子控件 43 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 44 { 45     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 46     if (self) { 47         //1.添加头像 48         UIImageView *img=[[UIImageView alloc]init]; 49         [self.contentView addSubview:img]; 50         self.iconView=img; 51          52         //2.添加昵称 53         UILabel *namelab=[[UILabel alloc]init]; 54         //在创建昵称的时候就要告诉它,将来要用15号字体显示 55         namelab.font=YYNameFont; 56         [self.contentView addSubview:namelab]; 57         self.nameLabel=namelab; 58          59         //3.vip 60         UIImageView  *vipview=[[UIImageView alloc]init]; 61         vipview.image=[UIImage imageNamed:@"vip"]; 62         [self.contentView addSubview:vipview]; 63         self.vipView=vipview; 64       65         //4.正文 66         UILabel *textlab=[[UILabel alloc]init]; 67         //在创建正文的时候就要告诉它,将来要用16号字体显示 68         textlab.font=YYTextFont; 69         //设置正文在进行显示的时候进行换行 70         textlab.numberOfLines=0; 71         [self.contentView addSubview:textlab]; 72         self.textLab=textlab; 73          74         //5.图片 75         UIImageView *picture=[[UIImageView alloc]init]; 76         [self.contentView addSubview:picture]; 77         self.pictureView=picture; 78     } 79     return self; 80 } 81  82 /** 83  *  重写set方法 84  * 85  *  @param weibo 微博 86  */ 87 //-(void)setWeibo:(YYweiboModel *)weibo 88 //{ 89 //    //不要忘了,记录传递进来的模型 90 //    _weibo=weibo; 91 //    //给子控件赋值数据 92 //    [self settingData]; 93 //    //设置子控件的frame 94 //    [self settingFrame]; 95 //} 96  97 //重写set方法 98 -(void)setWeiboframe:(YYweiboFrame *)weiboframe 99 {100 101     _weiboframe=weiboframe;102     //给子控件赋值数据103     [self settingData];104     //设置子控件的frame105     [self settingFrame];106 }107 108 /**109  *  对子控件的数据进行设置110  */111 -(void)settingData112 {113     //1.设置头像的数据114     self.iconView.image=[UIImage imageNamed:_weiboframe.weibo.icon];115     116     //2.设置vip图标的数据117     //判断是否是vip,如果是那么就显示图标,并把字体设置为红色118     //注意这里的判断119     if (_weiboframe.weibo.vip) {120         self.vipView.hidden=NO;121 //        [self.textLab setTintColor:[UIColor redColor]];122         self.nameLabel.textColor=[UIColor redColor];123     }else124     {125         self.vipView.hidden=YES;126         self.nameLabel.textColor=[UIColor blackColor];127     }128 129     130     //所以的vip图标都是一样的,没有必要每次都设置,只需要在构造方法中设置一次就可以了。131    // self.vipView.image=[UIImage imageNamed:@"vip"];132     133     //3.设置正文内容的数据134     self.textLab.text=_weiboframe.weibo.text;135     136     //4.设置配图的数据137     self.pictureView.image=[UIImage imageNamed:_weiboframe.weibo.picture];138     139     //5.设置微博昵称数据140     self.nameLabel.text=_weiboframe.weibo.name;141 }142 143 144 /**145  *  设置子控件的Frame146  */147 -(void)settingFrame148 {149     //1.设置头像的frame150     151     self.iconView.frame=_weiboframe.iconF;152     153     //2.设置微博昵称的frame154     self.nameLabel.frame=_weiboframe.nameF;155     156     //3.设置vip图标的frame157     self.vipView.frame=_weiboframe.vipF;158     159     //4.设置正文的frame160     self.textLab.frame=_weiboframe.textF;161     162     //5.设置配图的frame163     164     if (_weiboframe.weibo.picture) {165         self.pictureView.frame=_weiboframe.pictureF;166     }167 }168 169 @end

YYViewController.m文件

 1 // 2 //  YYViewController.m 3 //  微博基本信息展示 4 // 5 //  Created by 孔医己 on 14-6-2. 6 //  Copyright (c) 2014年 itcast. All rights reserved. 7 // 8  9 #import "YYViewController.h"10 #import "YYweiboModel.h"11 #import "YYweiboCell.h"12 #import "YYweiboFrame.h"13 14 @interface YYViewController ()15 @property(nonatomic,strong)NSArray *weibos;16 17 @end18 19 @implementation YYViewController20 21 - (void)viewDidLoad22 {23     [super viewDidLoad];24 }25 26 #pragma mark -懒加载27 -(NSArray *)weibos28 {29     if (_weibos==Nil) {30         NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"statuses.plist" ofType:nil];31         NSArray *arrayM=[NSArray arrayWithContentsOfFile:fullpath];32         33         NSMutableArray *models=[NSMutableArray arrayWithCapacity:arrayM.count];34         for (NSDictionary *dict in arrayM) {35             YYweiboModel *weibomodel=[YYweiboModel weiboModelWithDict:dict];36             //创建一个新的模型37             YYweiboFrame *weiboframe=[[YYweiboFrame alloc]init];38             //接收到数据模型39             weiboframe.weibo=weibomodel;40             41             [models addObject:weiboframe];42         }43         _weibos=[models copy];44     }45     return _weibos;46 }47 48 #pragma mark- 数据源方法49 //返回多少组50 //这里可以不写,默认返回一组51 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView52 {53     return 1;54 }55 //每组多少行56 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section57 {58     return self.weibos.count;59 }60 //每组每行的数据-设置cell61 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath62 {63     //1.到缓存中去取cell64     static NSString *ID=@"ID";65     66      //2.没有则创建cell67     YYweiboCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];68     if (cell==nil) {69         cell=[[YYweiboCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];70     }71    72     //3.设置cell的数据73     cell.weiboframe=self.weibos[indexPath.row];74     75     //4.返回cell76     return cell;77     78 }79 80 #pragma mark-设置每一组的高度81 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath82 {83     //获取当前索引的frame和数据84     YYweiboFrame *weiboframe=self.weibos[indexPath.row];85     //返回每行的行高86     return weiboframe.cellHight;87 }88 #pragma mark- 隐藏状态栏89 -(BOOL)prefersStatusBarHidden90 {91     return YES;92 }93 @end

示意图:

iOS开发UI篇—以微博界面为例使用纯代码自定义cell程序编码全过程(三·完结)