标签:
导入素材 plist 和图片
status 封装数据 statuscell 构造cell模块 statusframe 来计算cell的高度 同时也可以把一部分 数据封装和 计算位置 写进去
// // HMStatus.h // 新浪微博 // // Created by YaguangZhu on 15/8/26. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import <Foundation/Foundation.h> @interface HMStatus : NSObject @property(nonatomic,copy) NSString *name; @property(nonatomic,copy) NSString *icon; @property(nonatomic,copy) NSString *text; @property(nonatomic,copy) NSString *picture; @property(nonatomic,assign) BOOL vip; - (instancetype)initWithDict:(NSDictionary *)dict; + (instancetype)statusWithDict:(NSDictionary *)dict; + (NSArray *)statuses; @end
// // HMStatus.m // 新浪微博 // // Created by YaguangZhu on 15/8/26. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import "HMStatus.h" @implementation HMStatus - (instancetype)initWithDict:(NSDictionary *)dict { self = [super init]; if (self) { [self setValuesForKeysWithDictionary:dict]; } return self; } + (instancetype)statusWithDict:(NSDictionary *)dict { return [[self alloc] initWithDict:dict]; } + (NSArray *)statuses { NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"statuses.plist" ofType:nil]]; NSMutableArray *arrayM = [NSMutableArray array]; for (NSDictionary *dict in array) { [arrayM addObject:[self statusWithDict:dict]]; } return arrayM; } @end
// // HMStatusCell.h // 新浪微博 // // Created by YaguangZhu on 15/8/26. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import <UIKit/UIKit.h> @class HMStatus; @interface HMStatusCell : UITableViewCell @property (nonatomic, strong) HMStatus *status; @end
// // HMStatusCell.m // 新浪微博 // // Created by YaguangZhu on 15/8/26. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import "HMStatusCell.h" #import "HMStatus.h" /** 姓名字体 */ #define kNameFont [UIFont systemFontOfSize:14] /** 正文字体 */ #define kTextFont [UIFont systemFontOfSize:16] @interface HMStatusCell() @property (nonatomic, strong) UIImageView *iconView; @property (nonatomic, strong) UILabel *nameView; @property (nonatomic, strong) UIImageView *vipView; @property (nonatomic, strong) UILabel *textView; @property (nonatomic, strong) UIImageView *pictureView; @end @implementation HMStatusCell - (UIImageView *)iconView { if (_iconView == nil) { _iconView = [[UIImageView alloc] init]; [self.contentView addSubview:_iconView]; } return _iconView; } - (UILabel *)nameView { if (_nameView == nil) { _nameView = [[UILabel alloc] init]; // 默认字体是17号 _nameView.font = kNameFont; [self.contentView addSubview:_nameView]; } return _nameView; } - (UIImageView *)vipView { if (_vipView == nil) { _vipView = [[UIImageView alloc] init]; _vipView.image = [UIImage imageNamed:@"vip"]; _vipView.hidden = YES; [self.contentView addSubview:_vipView]; } return _vipView; } - (UILabel *)textView { if (_textView == nil) { _textView = [[UILabel alloc] init]; _textView.font = kTextFont; _textView.numberOfLines = 0; [self.contentView addSubview:_textView]; } return _textView; } - (UIImageView *)pictureView { if (_pictureView == nil) { _pictureView = [[UIImageView alloc] init]; [self.contentView addSubview:_pictureView]; } return _pictureView; } - (void)setStatus:(HMStatus *)status { _status = status; // 1> 设置数据 [self settingData]; // 2> 设置位置 [self settingFrame]; } - (void)settingData { // 头像 self.iconView.image = [UIImage imageNamed:self.status.icon]; // 姓名 self.nameView.text = self.status.name; // vip(可选的) if (self.status.vip) { self.vipView.hidden = NO; self.nameView.textColor = [UIColor redColor]; } else { self.vipView.hidden = YES; self.nameView.textColor = [UIColor blackColor]; } // 正文 self.textView.text = self.status.text; // 配图(可选参数) // imageNamed:nil CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000 if (self.status.picture.length > 0) { self.pictureView.hidden = NO; self.pictureView.image = [UIImage imageNamed:self.status.picture]; } else { self.pictureView.hidden = YES; } } - (void)settingFrame { // 0. 定义间距 CGFloat padding = 10; // 1. 头像 CGFloat iconX = padding; CGFloat iconY = padding; CGFloat iconW = 30; CGFloat iconH = 30; self.iconView.frame = CGRectMake(iconX, iconY, iconW, iconH); // 2. 姓名大小由文字的长度来决定 // boundingRectWithSize计算给定文本字符串所占的区域 // 返回值是一个x,y = 0的CGRect,w,h是计算好的宽高 // // 如果要计算多行的准确高度,需要传入NSStringDrawingUsesLineFragmentOrigin选项 // dict用于指定字体的相关属性的字典,UIKit框架中的第一个头文件 // context: nil NSDictionary *nameDict = @{NSFontAttributeName: kNameFont}; CGRect nameFrame = [self.status.name boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:nameDict context:nil]; nameFrame.origin.x = CGRectGetMaxX(self.iconView.frame) + padding; nameFrame.origin.y = padding + (self.iconView.bounds.size.height - nameFrame.size.height) * 0.5; self.nameView.frame = nameFrame; // vip图标 CGFloat vipX = CGRectGetMaxX(self.nameView.frame) + padding; CGFloat vipY = self.nameView.frame.origin.y; CGFloat vipW = 14; CGFloat vipH = 14; self.vipView.frame = CGRectMake(vipX, vipY, vipW, vipH); // 正文 NSDictionary *textDict = @{NSFontAttributeName: kTextFont}; CGRect textFrame = [self.status.text boundingRectWithSize:CGSizeMake(300, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:textDict context:nil]; textFrame.origin.x = padding; textFrame.origin.y = CGRectGetMaxY(self.iconView.frame) + padding; self.textView.frame = textFrame; CGFloat cellHeight; if (self.status.picture.length > 0) { // 配图 CGFloat pictureX = padding; CGFloat pictureY = CGRectGetMaxY(textFrame) + padding; CGFloat pictureW = 100; CGFloat pictureH = 100; self.pictureView.frame = CGRectMake(pictureX, pictureY, pictureW, pictureH); cellHeight = CGRectGetMaxY(self.pictureView.frame) + padding; } else { cellHeight = CGRectGetMaxY(self.textView.frame) + padding; } } - (void)awakeFromNib { // Initialization code } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state } @end
// // StatusFrame.h // 新浪微博 // // Created by YaguangZhu on 15/8/26. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @class HMStatus; @interface StatusFrame : NSObject @property (nonatomic, assign) CGRect iconf; @property (nonatomic, assign) CGRect namef; @property (nonatomic, assign) CGRect vipf; @property (nonatomic, assign) CGRect textf; @property (nonatomic, assign) CGRect picturef; /** 行高 */ @property (nonatomic, assign) CGFloat cellHeight; /** 所有控件的尺寸都可以通过Status来计算得出 */ @property (nonatomic, strong) HMStatus *status; /** 所有的statusFrame数据数组 */ + (NSArray *)statusFrames; @end
// // StatusFrame.m // 新浪微博 // // Created by YaguangZhu on 15/8/26. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import "StatusFrame.h" #import "HMStatus.h" /** 姓名字体 */ #define kNameFont [UIFont systemFontOfSize:14] /** 正文字体 */ #define kTextFont [UIFont systemFontOfSize:16] @implementation StatusFrame -(void)setStatus:(HMStatus *)status { _status = status; // 0. 定义间距 CGFloat padding = 10; // 1. 头像 CGFloat iconX = padding; CGFloat iconY = padding; CGFloat iconW = 30; CGFloat iconH = 30; self.iconf = CGRectMake(iconX, iconY, iconW, iconH); // 2. 姓名大小由文字的长度来决定 // boundingRectWithSize计算给定文本字符串所占的区域 // 返回值是一个x,y = 0的CGRect,w,h是计算好的宽高 // // 如果要计算多行的准确高度,需要传入NSStringDrawingUsesLineFragmentOrigin选项 // dict用于指定字体的相关属性的字典,UIKit框架中的第一个头文件 // context: nil NSDictionary *nameDict = @{NSFontAttributeName: kNameFont}; CGRect nameFrame = [self.status.name boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:nameDict context:nil]; nameFrame.origin.x = CGRectGetMaxX(self.iconf) + padding; nameFrame.origin.y = padding + (self.iconf.size.height - nameFrame.size.height) * 0.5; self.namef = nameFrame; // vip图标 CGFloat vipX = CGRectGetMaxX(self.namef) + padding; CGFloat vipY = self.namef.origin.y; CGFloat vipW = 14; CGFloat vipH = 14; self.vipf = CGRectMake(vipX, vipY, vipW, vipH); // 正文 NSDictionary *textDict = @{NSFontAttributeName: kTextFont}; CGRect textFrame = [self.status.text boundingRectWithSize:CGSizeMake(300, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:textDict context:nil]; textFrame.origin.x = padding; textFrame.origin.y = CGRectGetMaxY(self.iconf) + padding; self.textf = textFrame; //CGFloat cellHeight; if (self.status.picture.length > 0) { // 配图 CGFloat pictureX = padding; CGFloat pictureY = CGRectGetMaxY(textFrame) + padding; CGFloat pictureW = 100; CGFloat pictureH = 100; self.picturef = CGRectMake(pictureX, pictureY, pictureW, pictureH); self.cellHeight = CGRectGetMaxY(self.picturef) + padding; } else { self.cellHeight = CGRectGetMaxY(self.textf) + padding; } } + (NSArray *)statusFrames { NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"statuses.plist" ofType:nil]]; NSMutableArray *arrayM = [NSMutableArray array]; for (NSDictionary *dict in array) { // 要添加statusFrame对象 StatusFrame *statusFrame = [[StatusFrame alloc] init]; // 实例化一个新的Status模型 HMStatus *status = [HMStatus statusWithDict:dict]; // 调用自己的setter方法,保存status数据模型,同时计算出所有控件的位置 statusFrame.status = status; // 将statusFrame添加到数组 [arrayM addObject:statusFrame]; } return arrayM; } @end
// // ViewController.h // 新浪微博 // // Created by YaguangZhu on 15/8/26. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import <UIKit/UIKit.h> @interface ViewController : UITableViewController @end
// // ViewController.m // 新浪微博 // // Created by YaguangZhu on 15/8/26. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import "ViewController.h" #import "HMStatus.h" #import "HMStatusCell.h" #import "StatusFrame.h" @interface ViewController () @property(nonatomic,strong) NSArray *statuseFrames; @property(nonatomic,strong) NSArray *statuses; @end @implementation ViewController //- (NSArray *)statusFrames //{ // if (_statuseFrames ==nil) { // _statuseFrames = [StatusFrame statusFrames]; // } // return _statuseFrames; //} - (NSArray *)statuses { if (_statuses ==nil) { _statuses = [HMStatus statuses]; } return _statuses; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { //return self.statuseFrames.count; return self.statuses.count; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *ID =@"cell"; // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; // if (cell ==nil) { // cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; // } HMStatusCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (cell ==nil) { cell = [[HMStatusCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; } // HMStatus *status = self.statuses[indexPath.row]; // cell.textLabel.text =status.name; cell.status = self.statuses[indexPath.row]; // StatusFrame *statusFrame = self.statuseFrames[indexPath.row]; // cell.status = statusFrame.status; return cell; } #pragma mark - 代理方法 /** 计算单元格行高 */ - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { /** 计算行高的方法,会在加载表格数据时,有多少行计算多少次 contentSize 问题:此方法执行的时候,cell还没有被实例化! 但是:行高计算是在实例化cell时,通过设置status属性,计算的=>有了status模型,就可以知道行高! 问题:如何在cell实例化之前,获得行高? 解决方法:通过status可以计算得到行高!=》再建立一个模型,专门计算所有控件的位置 */ StatusFrame *statusFrame = [[StatusFrame alloc] init]; statusFrame.status =self.statuses[indexPath.row]; return statusFrame.cellHeight; //return 400; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.tableView.rowHeight = 400; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
标签:
原文地址:http://www.cnblogs.com/zhuyaguang/p/4760400.html