文档章节

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

hejunbinlan
 hejunbinlan
发布于 2015/06/24 11:09
字数 4565
阅读 173
收藏 0
点赞 0
评论 0

一、需要改进的地方

还需改进的地方: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 : NSObject 12 /** 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  * 是否是vip 30 */ 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 YYweiboModel 12 13 -(instancetype)initWithDict:(NSDictionary *)dict 14 { 15 if (self = [super init]) { 16 //使用KVC 17  [self setValuesForKeysWithDictionary:dict]; 18  } 19 return self; 20 } 21 22 /** 23  * 工厂方法 24  * 25  * @param dict 字典 26  * 27  * @return 模型 28 */ 29 +(instancetype)weiboModelWithDict:(NSDictionary *)dict 30 { 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 : UITableViewCell 13 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)settingData 100 { 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 }else 112  { 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  * 设置子控件的Frame 134 */ 135 -(void)settingFrame 136 { 137 //1.设置头像的frame 138 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.设置微博昵称的frame 147 //昵称的X值=头像的最大的x值+padding 148 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图标的frame 155 //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.设置正文的frame 163 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.设置配图的frame 169 //添加一个变量,来计算行高 170 CGFloat cellHight=0; 171 //如果有配图,则行高=配图最大的Y值+padding 172 //如果没有配图,则行高=文本最大的Y值+padding 173 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 }else 181 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)maxSize 195 { 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 : NSObject 13 /** 14  * 头像的frame 15 */ 16 @property(nonatomic,assign)CGRect iconF; 17 /** 18  * vip图标的frame 19 */ 20 @property(nonatomic,assign)CGRect vipF; 21 /** 22  * 微博昵称的frame 23 */ 24 @property(nonatomic,assign)CGRect nameF; 25 /** 26  * 配图的frame 27 */ 28 @property(nonatomic,assign)CGRect pictureF; 29 /** 30  * 正文的frame 31 */ 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 YYweiboFrame 17 18 /** 19  * 重写weibo的set方法,设置模型数据的frame属性 20 */ 21 -(void)setWeibo:(YYweiboModel *)weibo 22 { 23 _weibo=weibo; 24 25 //1.设置头像的frame 26 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.设置微博昵称的frame 35 //昵称的X值=头像的最大的x值+padding 36 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图标的frame 43 //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.设置正文的frame 51 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.设置配图的frame 57 //添加一个变量,来计算行高 58 //CGFloat cellHight=0; 59 //如果有配图,则行高=配图最大的Y值+padding 60 //如果没有配图,则行高=文本最大的Y值+padding 61 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 }else 69 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)maxSize 83 { 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 : UITableViewController 12 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 @end 18 19 @implementation YYViewController 20 21 - (void)viewDidLoad 22 { 23  [super viewDidLoad]; 24 } 25 26 #pragma mark -懒加载 27 -(NSArray *)weibos 28 { 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 *)tableView 52 { 53 return 1; 54 } 55 //每组多少行 56 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 57 { 58 return self.weibos.count; 59 } 60 //每组每行的数据-设置cell 61 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 62 { 63 //1.到缓存中去取cell 64 static NSString *ID=@"ID"; 65 //2.没有则创建cell 66 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.返回cell 75 return cell; 76 77 } 78 79 #pragma mark-设置每一组的高度 80 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 81 { 82 //获取当前索引的frame和数据 83 YYweiboFrame *weiboframe=self.weibos[indexPath.row]; 84 //返回每行的行高 85 return weiboframe.cellHight; 86 } 87 #pragma mark- 隐藏状态栏 88 -(BOOL)prefersStatusBarHidden 89 { 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 : UITableViewCell 13 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 //设置子控件的frame 105  [self settingFrame]; 106 } 107 108 /** 109  * 对子控件的数据进行设置 110 */ 111 -(void)settingData 112 { 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 }else 124  { 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  * 设置子控件的Frame 146 */ 147 -(void)settingFrame 148 { 149 //1.设置头像的frame 150 151 self.iconView.frame=_weiboframe.iconF; 152 153 //2.设置微博昵称的frame 154 self.nameLabel.frame=_weiboframe.nameF; 155 156 //3.设置vip图标的frame 157 self.vipView.frame=_weiboframe.vipF; 158 159 //4.设置正文的frame 160 self.textLab.frame=_weiboframe.textF; 161 162 //5.设置配图的frame 163 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 @end 18 19 @implementation YYViewController 20 21 - (void)viewDidLoad 22 { 23  [super viewDidLoad]; 24 } 25 26 #pragma mark -懒加载 27 -(NSArray *)weibos 28 { 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 *)tableView 52 { 53 return 1; 54 } 55 //每组多少行 56 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 57 { 58 return self.weibos.count; 59 } 60 //每组每行的数据-设置cell 61 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 62 { 63 //1.到缓存中去取cell 64 static NSString *ID=@"ID"; 65 66 //2.没有则创建cell 67 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.返回cell 76 return cell; 77 78 } 79 80 #pragma mark-设置每一组的高度 81 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 82 { 83 //获取当前索引的frame和数据 84 YYweiboFrame *weiboframe=self.weibos[indexPath.row]; 85 //返回每行的行高 86 return weiboframe.cellHight; 87 } 88 #pragma mark- 隐藏状态栏 89 -(BOOL)prefersStatusBarHidden 90 { 91 return YES; 92 } 93 @end

 示意图:

© 著作权归作者所有

共有 人打赏支持
hejunbinlan
粉丝 40
博文 532
码字总数 21018
作品 0
浦东
高级程序员
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊 ⋅ 05/26 ⋅ 0

RN与原生交互(一)——基本页面跳转

React Native(以下简称RN)开发app过程中大部分都可以在JS端完成,但是也有一些功能是需要原生端来完成的。这时RN与原生端就不可避免的需要进行交互,比如页面跳转和数据传递。本篇文章主要以...

不變旋律 ⋅ 06/13 ⋅ 0

iOS小白点效果、打地鼠游戏、轮播效果、画板、富文本编辑器等源码

iOS精选源码 美团外卖商家点菜页面(http://www.code4app.com/thread-29383-1-1.html) 板书录制演示程序(http://www.code4app.com/thread-29384-1-1.html) 分类轮播、直播间礼物列表轮播 -- O...

sunnyaigd ⋅ 04/24 ⋅ 0

小程序iOS客户端框架——控件事件逻辑框架与控件原生化

小程序自发布以来,为开发者和用户提供了一种轻量级的App。作为一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用。小程序也体现了“用...

codeGoogle ⋅ 04/24 ⋅ 0

小程序iOS客户端框架—控件事件逻辑框架与控件原生化

小程序自发布以来,为开发者和用户提供了一种轻量级的App。作为一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用。小程序也体现了“用...

codeGoogle ⋅ 04/26 ⋅ 0

iOS三维菜单、调试工具、封装通讯录、网络框架、多种控件和动画等源码

iOS精选源码 一个调用系统通讯录和获取通讯录所有联系人的封装(http://www.code4app.com/thread-29726-1-1.html) ios scrollview嵌套tableview同向滑动(初级、进阶), 支持OC / Swift(http...

sunnyaigd ⋅ 05/15 ⋅ 0

iOS高仿QQ侧滑控件、下载框架、动画效果、扫一扫、颜色变化、K线图等源码

iOS精选源码 仿京东"加入购物车"转场动画(http://www.code4app.com/thread-28162-1-1.html) ColorTool(颜色转换)(http://www.code4app.com/thread-29256-1-1.html) Swift 专业版K线(http://w......

sunnyaigd ⋅ 04/17 ⋅ 0

面试官自述:面向高级开发人员的iOS面试问题

当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。 这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。 这些问题涉及iOS开发的...

菇哒微课 ⋅ 04/26 ⋅ 0

不满微软收购GitHub 网友纷纷晒出表情包

不满微软收购GitHub 网友纷纷晒出表情包 2018-06-07 12:42编辑: yyuuzhu分类:程序人生来源:程序师 微软Github 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发工程师 京东招聘iOS...

yyuuzhu ⋅ 06/07 ⋅ 0

iOS渐变字体、动态条纹、获取特定位置cell、笔记App、购物车界面等源码

iOS精选源码 RAC实现添加购物车(http://www.code4app.com/thread-29956-1-1.html) 一个基于Photos.framework的图片多选,持续功能的更新中(http://www.code4app.com/thread-29959-1-1.html)...

sunnyaigd ⋅ 05/29 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 51分钟前 ⋅ 0

Spring JavaConfig 注解

JavaConfig注解允许开发者将Bean的定义和配置放在Java类中。它是除使用XML文件定义和配置Bean外的另一种方案。 配置: 如一个Bean如果在XML文件可以这样配置: <bean id="helloBean" class="...

霍淇滨 ⋅ 58分钟前 ⋅ 0

Spring clound 组件

Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。...

英雄有梦没死就别停 ⋅ 今天 ⋅ 0

Confluence 6 重新获得站点备份文件

Confluence 将会创建备份,同时压缩 XML 文件后存储熬你的 <home-directory>/backups> 目录中。你需要自己访问你安装的 Confluence 服务器,并且从服务器上获得这个文件。 运行从 Confluence...

honeymose ⋅ 今天 ⋅ 0

informix的常用SQL语句

1、创建数据库 eg1. 创建不记录日志的库testdb,参考语句如下: CREATE DATABASE testdb; eg2. 创建带缓冲式的记录日志的数据库testdb(SQL语句不一定在事务之中,拥有者名字不被用于对象的解...

wangxuwei ⋅ 今天 ⋅ 0

matplotlib画图

最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数。 from pylab import *from numpy import *x = linspace(0, 5, 10)y = x ** 2figure()plot(x, y, 'r')...

Dr_hu ⋅ 今天 ⋅ 0

RabbitMQ学习以及与Spring的集成(三)

本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收。 在RabbitMQ的Spring配置文件中,首先需要增加命名空间。 xmlns:rabbit="http://www.springframework.org/schema/rabbit" 其次是模...

onedotdot ⋅ 今天 ⋅ 0

JAVA实现仿微信红包分配规则

最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制 对于微...

小致dad ⋅ 今天 ⋅ 0

Python 数电表格格式化 xlutils xlwt xlrd的使用

需要安装 xlutils xlwt xlrd 格式化前 格式化后 代码 先copy读取的表格,然后按照一定的规则修改,将昵称中的学号提取出来替换昵称即可 from xlrd import open_workbookfrom xlutils.copy ...

阿豪boy ⋅ 今天 ⋅ 0

面试题:使用rand5()生成rand7()

前言 读研究生这3 年,思维与本科相比变化挺大的,这几年除了看论文、设计方案,更重要的是学会注重先思考、再实现,感觉更加成熟吧,不再像个小P孩,人年轻时总会心高气傲。有1 道面试题:给...

初雪之音 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部