首页 > 代码库 > iOS开发项目篇—41cell的frame设计

iOS开发项目篇—41cell的frame设计

iOS开发项目篇—41cell的frame设计

一、简单说明

1.分层设计

在进行设计的时候,建议先分析整个cell的结构,确定了cell由哪些模块构成之后,再进一步确定每个模块中包含的子控件。

在这个微博的cell中,把这个cell分成两个大的模块。分解结构如下:

1.微博完整内容模块View

(1)原创微博view

  1)头像imageView

  2)自己的昵称label

  3)发布的时间label

  4)微博来源label

  5)微博的正文

(2)转发微博

  1)原作者的昵称label

  2)转发的微博正文label

2.toolbar工具条模块View

(1)转发button

(2)评论button

(3)赞button

示意图:

 

分层设计的好处:屏蔽了最上层和最下层的处理细节,下层代码修改后,顶层不需要跟着进行修改。

(1)每个类的冗余度低,易于维护

(2)业务逻辑精准,每个类只封装自己该做的事情

 

2.frame的设计

对应于模块的设计,得出frame设计的示意图:

说明:需要新建5个类。管理对应的frame。

二、代码设计

1.文件结构

2.代码实现

YYStatusCell.h文件

 1 // 2 //  YYStatusCell.h 3 // 4  5 #import <UIKit/UIKit.h> 6 @class YYStatusFrame; 7 @interface YYStatusCell : UITableViewCell 8 #warning 注意这里不能直接使用frame作为属性名。继承自UIview,而它本身就有一个frame。 9 @property(nonatomic,strong)YYStatusFrame *statusFrame;10 @end

YYStatusCell.m文件

 1 // 2 //  YYStatusCell.m 3 //  自定义cell 4  5 #import "YYStatusCell.h" 6 #import "YYStatusDetailView.h" 7 #import "YYStatusToolbar.h" 8 //#import "YYStatusDetailFrame.h" 9 #import "YYStatusFrame.h"10 11 @interface YYStatusCell ()12 @property(nonatomic,weak)YYStatusDetailView *detailView;13 @property(nonatomic,weak)YYStatusToolbar *toolbar;14 @end15 16 @implementation YYStatusCell17 18 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier19 {20     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];21     if (self) {22         //初始化子控件23         24         //1.添加微博具体内容25         [self setupDetailView];26         27         //2.添加工具条28         [self setupToolbar];29     }30     return self;31 }32 33 /**添加微博具体内容*/34 -(void)setupDetailView35 {36     YYStatusDetailView *detailView=[[YYStatusDetailView alloc]init];37     [self.contentView addSubview:detailView];38     self.detailView=detailView;39 }40 41 /**添加工具条*/42 -(void)setupToolbar43 {44     YYStatusToolbar *toolbar=[[YYStatusToolbar alloc]init];45     [self.contentView addSubview:toolbar];46     self.toolbar=toolbar;47 }48 49 -(void)setStatusFrame:(YYStatusFrame *)statusFrame50 {51     _statusFrame=statusFrame;52     //1.微博具体内容的frame数据53     self.detailView.detailFrame=statusFrame.StatusDetailFrame;54     55     //2.底部工具条的frame数据56     self.toolbar.frame=statusFrame.toolbarFrame;57 }58 @end

YYStatusFrame.h文件

 1 // 2 //  YYStatusFrame.h 3 //一个Frame包括一个cell内部所有的子控件的frame和显示数据 4  5 //获取frame--->根据传入的数据值进行计算,这里需要传入微博数据模型,对子控件的frame进行分层 6 #import <Foundation/Foundation.h> 7 @class YYStatusModel,YYStatusDetailFrame; 8 @interface YYStatusFrame : NSObject 9 10 /**11  *  toolbar工具条的frame12  */13 @property(nonatomic,assign)CGRect toolbarFrame;14 /**15  *  微博整体内容的frame16  */17 @property(nonatomic,strong)YYStatusDetailFrame *StatusDetailFrame;18 /**19  *  cell的高度20  */21 @property(nonatomic,assign)CGFloat cellHight;22 23 //传入微博数据模型24 @property(nonatomic,strong)YYStatusModel *status;25 @end

 YYStatusFrame.m文件

 1 // 2 //  YYStatusFrame.m 3 // 4  5 #import "YYStatusFrame.h" 6 #import "YYStatusDetailFrame.h" 7  8 @implementation YYStatusFrame 9 -(void)setStatus:(YYStatusModel *)status10 {11     _status=status;12     //1.计算微博的具体内容(微博整体)13     [self setupStatusDetailFrame];14     15     //2.计算底部工具条16     [self setupToolbarFrame];17     18     //3.计算cell的高度19     self.cellHight=CGRectGetMaxY(self.toolbarFrame);20 }21 22 /**23  *  计算微博的具体内容(微博整体)24  */25 -(void)setupStatusDetailFrame26 {27     YYStatusDetailFrame *detailFrame=[[YYStatusDetailFrame alloc]init];28     detailFrame.status=self.status;29     self.StatusDetailFrame=detailFrame;30 }31 32 /**33  *  计算底部工具条34  */35 -(void)setupToolbarFrame36 {37     CGFloat toolbarX=0;38     CGFloat toolbarW=YYScreenW;39     CGFloat toolbarH=35;40     CGFloat toolbarY=CGRectGetMaxY(self.StatusDetailFrame.frame);41     self.toolbarFrame=CGRectMake(toolbarX, toolbarY, toolbarW, toolbarH);42 }43 @end

YYStatusDetailView.h文件

 1 // 2 //  YYStatusDetailView.h 3 // 4  5 #import <UIKit/UIKit.h> 6  7 @class  YYStatusDetailFrame; 8 @interface YYStatusDetailView : UIView 9 @property(nonatomic,strong)YYStatusDetailFrame *detailFrame;10 @end

YYStatusDetailView.m文件

 1 // 2 //  YYStatusDetailView.m 3 // 4  5 #import "YYStatusDetailView.h" 6 #import "YYStatusOriginalView.h" 7 #import "YYStatusRetweetedView.h" 8 #import "YYStatusDetailFrame.h" 9 10 @interface YYStatusDetailView ()11 @property(nonatomic,weak)YYStatusOriginalView *OriginalView;12 @property(nonatomic,weak)YYStatusRetweetedView *retweetedView;13 @end14 @implementation YYStatusDetailView15 16 - (id)initWithFrame:(CGRect)frame17 {18     self = [super initWithFrame:frame];19     if (self) {20         //初始化子控件21         22         //1.添加原创微博23         [self setupOriginalView];24         25         //2.添加转发微博26         [self setupRetweetedView];27     }28     return self;29 }30 /**添加原创微博*/31 -(void)setupOriginalView32 {33     YYStatusOriginalView *OriginalView = [[YYStatusOriginalView alloc]init];34     [self addSubview:OriginalView];35     self.OriginalView=OriginalView;36     37 }38 /**添加转发微博*/ 39 -(void)setupRetweetedView40 {41     YYStatusRetweetedView *retweetedView = [[YYStatusRetweetedView alloc]init];42     [self addSubview:retweetedView];43     self.retweetedView=retweetedView;44 }45 46 -(void)setDetailFrame:(YYStatusDetailFrame *)detailFrame47 {48     _detailFrame=detailFrame;49     50     //0.设置自己的frame51     self.frame=detailFrame.frame;52     53     //1.原创微博的frame的设置54     self.OriginalView.originalFrame=detailFrame.originalFrame;55     56     //2.转发微博的frame的设置57     self.retweetedView.retweetedFrame=detailFrame.retweetedFrame;58 }59 @end

YYStatusDetailFrame.h文件

 1 // 2 //  YYStatusDetailFrame.h 3 // 4  5 #import <Foundation/Foundation.h> 6  7 @class YYStatusModel,YYStatusOriginalFrame,YYStatusRetweetedFrame; 8 @interface YYStatusDetailFrame : NSObject 9 10 /**11  *  微博数据模型12  */13 @property(nonatomic,strong)YYStatusModel *status;14 15 @property(nonatomic,strong)YYStatusOriginalFrame *originalFrame;16 @property(nonatomic,strong)YYStatusRetweetedFrame *retweetedFrame;17 /**18  *  自己的frame19  */20 @property(nonatomic,assign)CGRect frame;21 @end

YYStatusDetailFrame.m文件

 1 // 2 //  YYStatusDetailFrame.m 3 // 4  5 #import "YYStatusDetailFrame.h" 6 #import "YYStatusOriginalFrame.h" 7 #import "YYStatusRetweetedFrame.h" 8 #import "YYStatusModel.h" 9 10 @interface YYStatusDetailFrame ()11 @property(nonatomic,assign)CGFloat tempHeight;12 @end13 @implementation YYStatusDetailFrame14 15 -(void)setStatus:(YYStatusModel *)status16 {17     _status=status;18     //1.计算原创微博的frame19     [self setupStatusOriginalFrame];20     21     //2.计算转发微博的frame22     [self setupStatusRetweetedFrameWithStatus:status];23     24     //3.计算自己的frame25     [self setupDetailFrame];26     27 }28 29 /**30  *  计算原创微博的frame31  */32 -(void)setupStatusOriginalFrame33 {34     YYStatusOriginalFrame *originalFrame=[[YYStatusOriginalFrame alloc]init];35     originalFrame.status=self.status;36     self.originalFrame=originalFrame;37 }38 39 /**40  *  计算转发微博的frame41  */42 -(void)setupStatusRetweetedFrameWithStatus:(YYStatusModel *)status43 {44     if (status.retweeted_status) {45         YYStatusRetweetedFrame *retweetedFrame=[[YYStatusRetweetedFrame alloc]init];46         retweetedFrame.retweeted_status=status.retweeted_status;47         self.retweetedFrame=retweetedFrame;48         49         CGRect f=retweetedFrame.frame;50         f.origin.y=CGRectGetMaxY(self.originalFrame.frame);51         retweetedFrame.frame=f;52        self.tempHeight=CGRectGetMaxY(self.retweetedFrame.frame);53     }else54     {55         self.tempHeight=CGRectGetMaxX(self.originalFrame.frame);56     }57 58 }59 60 /**61  *  计算自己的frame62  */63 -(void)setupDetailFrame64 {65     CGFloat x=0;66     CGFloat y=0;67     CGFloat w=YYScreenW;68     CGFloat h=self.tempHeight;69     self.frame=CGRectMake(x, y, w, h);70 }71 @end

YYStatusOriginal.h文件

 1 // 2 //  YYStatusOriginal.h 3 // 4  5 #import <UIKit/UIKit.h> 6  7 @class YYStatusOriginalFrame; 8 @interface YYStatusOriginalView : UIView 9 @property(nonatomic,strong)YYStatusOriginalFrame *originalFrame;10 @end

YYStatusOriginal.m文件

  1 //  2 //  YYStatusOriginal.m  3 //  34-微博搭建cell的基本结构  4 //  5 //  Created by apple on 14-7-17.  6 //  Copyright (c) 2014年 itcase. All rights reserved.  7 //  8   9 #import "YYStatusOriginalView.h" 10 #import "YYStatusOriginalFrame.h" 11 #import "YYUserModel.h" 12 #include "YYStatusModel.h" 13 #import "UIImageView+WebCache.h" 14  15 @interface YYStatusOriginalView () 16 /** 17  *  头像 18  */ 19 @property(nonatomic,weak)UIImageView *iconView; 20 /** 21  *  昵称 22  */ 23 @property(nonatomic,weak)UILabel  *nameLabel; 24 /** 25  *  微博的正文 26  */ 27 @property(nonatomic,weak)UILabel *textLabel; 28 /** 29  *  时间 30  */ 31 @property(nonatomic,weak)UILabel *timeLabel; 32 /** 33  *  来源 34  */ 35 @property(nonatomic,weak)UILabel *sourceLabel; 36  37 @end 38 @implementation YYStatusOriginalView 39  40 - (id)initWithFrame:(CGRect)frame 41 { 42     self = [super initWithFrame:frame]; 43     if (self) { 44         //初始化子控件 45         //1.头像 46         UIImageView *iconView=[[UIImageView alloc]init]; 47         [self addSubview:iconView]; 48         self.iconView=iconView; 49          50         //2.昵称 51         UILabel *nameLabel=[[UILabel alloc]init]; 52         [self addSubview:nameLabel]; 53         self.nameLabel=nameLabel; 54          55         //3.正文 56         UILabel *textLabel=[[UILabel alloc]init]; 57         [self addSubview:textLabel]; 58         self.textLabel=textLabel; 59          60         //4.时间 61         UILabel *timeLabel=[[UILabel alloc]init]; 62         [self addSubview:timeLabel]; 63         self.timeLabel=timeLabel; 64          65         //5.来源 66         UILabel *sourceLabel=[[UILabel alloc]init]; 67         [self addSubview:sourceLabel]; 68         self.sourceLabel=sourceLabel; 69          70     } 71     return self; 72 } 73  74 -(void)setOriginalFrame:(YYStatusOriginalFrame *)originalFrame 75 { 76     _originalFrame=originalFrame; 77      78     //设置自己的frame 79     self.frame=originalFrame.frame; 80      81     //取出模型数据 82     YYStatusModel *status=originalFrame.status; 83      84     //设置头像的frame 85     [self.iconView setImageWithURL:[NSURL URLWithString:status.user.profile_image_url] placeholderImage:[UIImage imageWithName:@"avatar_default_small"]]; 86     self.iconView.frame=originalFrame.iconFrame; 87      88     //设置昵称的frame 89     self.nameLabel.text=status.user.name; 90     self.nameLabel.frame=originalFrame.nameFrame; 91      92     //设置正文的frame 93     self.textLabel.text=status.text; 94     self.textLabel.frame=originalFrame.textFrame; 95      96     //设置时间的frame 97     self.timeLabel.text=status.created_at; 98     self.timeLabel.frame=originalFrame.timeFrame; 99     100     //设置来源的frame101     self.sourceLabel.text=status.source;102     self.sourceLabel.frame=originalFrame.sourceFrame;103     104 }105 @end

YYStatusOriginalFrame.h文件

 1 // 2 //  YYStatusOriginalFrame.h 3 // 4  5 #import <Foundation/Foundation.h> 6  7 @class YYStatusModel; 8 @interface YYStatusOriginalFrame : NSObject 9 /**10  *  微博数据模型11  */12 @property(nonatomic,strong)YYStatusModel *status;13 14 /** 昵称 */15 @property (nonatomic, assign) CGRect nameFrame;16 /** 正文 */17 @property (nonatomic, assign) CGRect textFrame;18 /** 来源 */19 @property (nonatomic, assign) CGRect sourceFrame;20 /** 时间 */21 @property (nonatomic, assign) CGRect timeFrame;22 /** 头像 */23 @property (nonatomic, assign) CGRect iconFrame;24 25 /** 自己的frame */26 @property (nonatomic, assign) CGRect frame;27 @end

YYStatusOriginalFrame.m文件

 1 // 2 //  YYStatusOriginalFrame.m 3 // 4  5 #import "YYStatusOriginalFrame.h" 6 #import "YYStatusModel.h" 7 #import "YYUserModel.h" 8  9 10 @implementation YYStatusOriginalFrame11 -(void)setStatus:(YYStatusModel *)status12 {13     _status=status;14     //1.计算头像的frame15     CGFloat iconX=YYCellStatusInset;16     CGFloat iconY=YYCellStatusInset;17     CGFloat iconW=35;18     CGFloat iconH=35;19     self.iconFrame=CGRectMake(iconX, iconY, iconW, iconH);20     21     //2.计算昵称的frame22     CGFloat nameX=CGRectGetMaxX(self.iconFrame) + YYCellStatusInset;23     CGFloat nameY=iconY;24     CGSize nameSize=[status.user.name sizeWithFont:YYStatusOrginalNameFont];25 //    self.iconFrame=CGRectMake(nameX, nameY, nameSize.width,nameSize.height);26     self.nameFrame=(CGRect){{nameX,nameY},nameSize};27     28     //3.计算时间的frame29     CGFloat timeX=nameX;30     CGFloat timeY=CGRectGetMaxY(self.nameFrame)+YYCellStatusInset;31     CGSize timeSize=[status.created_at sizeWithFont:YYStatusOrginalTimeFont];32     self.timeFrame=(CGRect){{timeX,timeY},timeSize};33     34     //4.计算发布来源的frame35     CGFloat sourcceX=CGRectGetMaxX(self.textFrame)+YYCellStatusInset;36     CGFloat sourcceY=timeY;37     CGSize sourcceSize=[status.source sizeWithFont:YYStatusOrginalSourceFont];38     self.sourceFrame=(CGRect){{sourcceX,sourcceY},sourcceSize};39     40     //5.计算微博正文的frame41 #warning 注意计算的区别42     CGFloat textX=iconX;43     CGFloat textY=CGRectGetMaxY(self.iconFrame)+YYCellStatusInset;44     CGFloat maxW=YYScreenW-2*YYCellStatusInset;45     CGSize maxSize=CGSizeMake(maxW, MAXFLOAT);46     CGSize textSize=[status.text sizeWithFont:YYStatusOrginalTextFont constrainedToSize:maxSize];47     self.textFrame=(CGRect){{textX,textY},sourcceSize};48     49     //6.计算自己的frame50     CGFloat x=0;51     CGFloat y=0;52     CGFloat w=YYScreenW;53     CGFloat h=CGRectGetMaxY(self.textFrame)+YYCellStatusInset;54     self.frame=CGRectMake(x, y, w, y);55 }56 @end

YYStatusRetweetedView.h文件

1 //2 //  YYStatusRetweetedView.h3 //4 5 #import <UIKit/UIKit.h>6 @class YYStatusRetweetedFrame;7 @interface YYStatusRetweetedView : UIView8 @property(nonatomic,strong)YYStatusRetweetedFrame *retweetedFrame;9 @end

YYStatusRetweetedView.m文件

 1 // 2 //  YYStatusRetweetedView.m 3 // 4  5 #import "YYStatusRetweetedView.h" 6 #import "YYStatusRetweetedFrame.h" 7 #import "YYStatusModel.h" 8 #import "YYUserModel.h" 9 10 @interface YYStatusRetweetedView ()11 /**12  *  昵称13  */14 @property(nonatomic,weak)UILabel  *nameLabel;15 /**16  *  微博的正文17  */18 @property(nonatomic,weak)UILabel *textLabel;19 @end20 @implementation YYStatusRetweetedView21 22 - (id)initWithFrame:(CGRect)frame23 {24     self = [super initWithFrame:frame];25     if (self) {26     //初始化子控件27     //1.添加昵称28         UILabel *nameLabel=[[UILabel alloc]init];29         [self addSubview:nameLabel];30         self.nameLabel=nameLabel;31         32     //2.添加微博正文33         UILabel *textLabel=[[UILabel alloc]init];34         [self addSubview:textLabel];35         self.textLabel=textLabel;36     }37     return self;38 }39 40 -(void)setRetweetedFrame:(YYStatusRetweetedFrame *)retweetedFrame41 {42     _retweetedFrame=retweetedFrame;43     44     //取出对应的数据模型45     YYStatusModel *retweeted_status=retweetedFrame.retweeted_status;46     47     //设置自己的frame48     self.frame=retweetedFrame.frame;49     50     //设置昵称的frame51     self.nameLabel.text=retweeted_status.user.name;52     self.nameLabel.frame=retweetedFrame.nameFrame;53     54     //设置正文的frame55     self.textLabel.text=retweeted_status.text;56     self.textLabel.frame=retweetedFrame.textFrame;57 }58 59 @end

 YYStatusRetweetedFrame.h文件

 1 // 2 //  YYStatusRetweetedFrame.h 3 // 4  5 #import <Foundation/Foundation.h> 6  7 @class YYStatusModel; 8 @interface YYStatusRetweetedFrame : NSObject 9 /**10  *  转发微博数据模型11  */12 @property(nonatomic,strong)YYStatusModel *retweeted_status;13 14 /** 昵称 */15 @property (nonatomic, assign) CGRect nameFrame;16 /** 正文 */17 @property (nonatomic, assign) CGRect textFrame;18 19 /** 自己的frame */20 @property (nonatomic, assign) CGRect frame;21 @end

 YYStatusRetweetedFrame.m文件

 1 // 2 //  YYStatusRetweetedFrame.m 3 // 4  5 #import "YYStatusRetweetedFrame.h" 6 #import "YYStatusModel.h" 7 #import "YYUserModel.h" 8  9 @implementation YYStatusRetweetedFrame10 -(void)setRetweeted_status:(YYStatusModel *)retweeted_status11 {12     _retweeted_status=retweeted_status;13     14     //1.计算昵称的frame15     CGFloat nameX=YYCellStatusInset;16     CGFloat nameY=YYCellStatusInset;17     CGSize nameSize=[retweeted_status.user.name sizeWithFont:YYStatusRetweetedNameFont];18     self.nameFrame=(CGRect){{nameX,nameY},nameSize};19     20     //2.计算转发微博的正文的frame21     CGFloat textX=nameX;22     CGFloat textY=CGRectGetMaxY(self.nameFrame)+YYCellStatusInset;23     CGFloat maxW=YYScreenW-2*YYCellStatusInset;24     CGSize maxSize=CGSizeMake(maxW, MAXFLOAT);25     CGSize textSize=[retweeted_status.text sizeWithFont:YYStatusRetweetedTextFont constrainedToSize:maxSize];26     self.textFrame=(CGRect){{textX,textY},textSize};27     28     //3.计算自己的frame29     CGFloat x=0;30 #warning y值为在整个view中的设置,为原创微博的最大的Y值,但是在这里拿不到这个值,可以到外面进行设置31     CGFloat y=0;32     CGFloat w=YYScreenW;33     CGFloat h=CGRectGetMaxY(self.textFrame)+YYCellStatusInset;34     self.frame=CGRectMake(x, y, w, h);35 }36 @end