iOS開發-通過代碼自訂cell

來源:互聯網
上載者:User

標籤:

一、添加子控制項和傳遞模型資料
注意:子控制項位置不固定,不能寫死時就用代碼自訂cell
步驟一:將控制器改為繼承UITableViewController,然後刪除故事板上原來的View,新拖一個TableView,並將Class改為控制器
步驟二:建立一個類WeiboCell,繼承自UITableViewCell
步驟三:在控制器實現檔案中匯入WeiboCell.h
第三個資料來源方法
static NSString *ID = @“weibo”;

weiboCell *cell = [tableView dequeueReUsableCellWithIdentifier:ID];

if (cell == nil){
cell = [weiboCell alloc] initWithStyle:UITableCellStyleDefault reuseIdentifier:ID]; //建立的是weiboCell,所以取出來的也應該是這個。
}
return cell;
}
步驟四:在WeiboCell.m中
-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier
{
self = [super initWithStyle reuseIdentifier:reuseIdentifier];
if (self){
// 添加內部的子控制項(不管位置和寬高,把有可能用到的全部加進去)

//1.頭像
_icon = [UIImageView alloc] init];
[self.contentView addSubview:_icon] ; //添加子控制項要添加到contentView中
//2.暱稱
_name = [UILabel alloc] init];
[self.contentView addSubview:_name];
//3.會員表徵圖
_vip = [UIImageView alloc] initWithImage:[UIImage imageNamed:@"vip.png"]];
[self.contentView addSubview:_vip];
//4.時間
_time = [UILabel alloc] init];
[self.contentView addSubview:_time];
//5.來源
_source = [UILabel alloc] init];
[self.contentView addSubview:_source];
//6.微博本文
_content = [UILabel alloc] init];
_content.numberOfLines = 0; //自動換行
[self.contentView addSubview:_content];
//7.配圖
_image = [UIImageView alloc] init];
[self.contentView addSubview:_image];

}

步驟五:開發模型並把模型傳給cell
已準備好plist檔案(Root為Array)
建立一個模型類Weibo,並聲明7個屬性。
並寫2個方法用來把字典傳進來變成模型
-(id)initWithDict:(NSDictionary *)dict
{
if (self = [super init]){
self.name = dict[@“name”];
self.time = dict[@“time”];
self.name = dict[@“name”];
self.name = dict[@“name”];
self.name = dict[@“name”];
self.name = dict[@“name”];
self.name = dict[@“name”];
}
}
+(id)weiboWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
}
步驟六:在WeiboCell的標頭檔中傳一個微博模型
@class weibo;
@property (nonatomic,strong)weibo weibo;

步驟七:在WeiboCell的實現檔案中重寫set方法,在這個方法將模型資料賦值給子控制項
匯入weibo.h
先在類擴充中將7個子控制項聲明為成員變數,然後將這些控制項全部改為底線
-(void)setWeibo:(weibo *)weibo
{
_weibo = weibo;

//1.頭像
_icon.image = [UIImage imageNamed:weibo.icon];

//2.暱稱
_name.text = weibo.name;
if (_weibo.vip){
_name.textColor = [UIColor yellowColor];
} else {
_name.textColor = [UIColor blackColor];
}

//3.會員表徵圖
_vip.hidden = !weibo.vip;

//4.時間
_time.text = weibo.time;

//5.來源
_source.text = [NSString stringWithFormat:@"來自%@",_weibo.source];

//6.本文
_content.text = weibo.content;

//7.配圖
if (weibo.image){ //有配圖
_image.hidden = NO;

_image.image = [UIImage imageNamed:weibo.image];
} else { //沒有配圖
_image.hidden = YES;
}
}


步驟八:控制器載入plist檔案(只需要載入一次,所以在viewDidLoad中)
NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle
pathForResource:@"weibo.plist" ofType:nil]];

匯入Weibo.h,並在類擴充中聲明一個數群組成員變數用來裝資料
_weibos = [NSMutableArray array];
for (NSDictionary *dict in array){
[_weibos addObject:(Weibo weiboWithDict:dict)];
}
}

步驟九:實現資料來源方法
第二個資料來源方法
return _weibos.count;
第三個資料來源方法
// 1.去緩衝池中取出cell
static NSString *ID = @”weibo“;
WeiboCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

//2.緩衝池沒有cell,重新建立cell
if (cell == nil){
cell = [[WeiboCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
}
//3.傳遞模型資料
cell.weibo = _weibos[indexPath.row];

return cell;
}

二、計運算元控制項的frame
將設定資料的程式碼片段放到新方法settingData中,然後在set方法中調用這個方法即可
-(void)setWeibo:(Weibo *)weibo
{
_weibo = weibo;

//1.設定微博資料
[self settingData]

//2.設定子控制項的frame(x,y,width,height)
[self settingSubViewFrame];
}

-(void)settingSubviewFrame
{
// 1. 頭像
CGFloat iconX = kCellBorder;
CGFloat iconY = kCellBorder;
_icon.frame = CGRectMake(iconX,iconY,kIconMH,kIconMH);

// 2. 暱稱
CGFloat nameX = CGRectGetMaxX(_icon.frame)+ kCellBorder;
CGFloat nameY = iconY;
//計算使用者名稱稱的尺寸
CGSize nameSize = [_weibo.name sizeWithFont:_name.font];
_icon.frame = CGRectMake(nameX,nameY,nameSize.width,nameSize.height)

//3.vip
CGFloat vipX = CGRectGetMaxX(_name.frame)+ kCellBorder;
CGFloat vipY = nameY;
_icon.frame = CGRectMake(vipX,vipY,kvipMH,kvipMH);

//4.時間
CGFloat timeX = nameX;
CGFloat timeY = CGRectGetMaxY(_name.frame)+ kCellBorder;
CGSize timeSize = [_weibo.time sizeWithFont:_time.font];
_time.frame = CGRectMake(timeX,timeY,timeSize.width,timeSize.height);

//5.來源
CGFloat sourceX = CGRectGetMaxX(_time.frame)+ kCellBorder;
CGFloat sourceY = timeY;
NSString *sourceText = [NSString stringWithFormat:@"來自%@",_weibo.source];
CGSize sourceSize = [sourceText sizeWithFont:_source.font];
_source.frame = CGRectMake(sourceX,sourceY,sourceSize.width,sourceSize.height);

//6.本文
CGFloat contentX = iconX;
CGFloat contentY = MAX(CGRectGetMaxY(_time.frame),CGRectGetMaxY(_icon.frame))+ kCellBorder;
CGFloat contentW = self.frame.size.width - 2*kCellBorder;
//計算文字尺寸(顯示文字的寬度)
CGSize contentSize = [_weibo.content sizeWithFont:_content.font constrainedToSize:CGSizeMake(contentW,MAXFLOAT)];
_content.frame = CGRectMake(contentX,contentY,contentW,contentSize.height) ;


//7.配圖\計算cell的高度
CGFloat cellHeight = 0;
if (_weibo.image){ //有配圖
CGFloat imageX = contentX;
CGFloat imageY = CGRectGetMaxY(_content.frame)+ kCellBorder;
_image.frame = CGRectMake(imageX,imageY,kImageWH,kImageWH);

CGFloat cellHeight = CGRectGetMaxY(_image.frame)+ kCellBorder;
} else {
CGFloat cellHeight = CGRectGetMaxY(_content.frame)+ kCellBorder;
}


因為是先調用代理方法再調用set方法,所以在set方法中計算高度然並卵
建立1個模型WeiboFrame用來存放一個cell內部所有子控制項的frame
聲明屬性如iconF等,還有一個屬性cellHeight和一個屬性Weibo(@class Weibo)
將計算frame的一大串代碼放到這個模型的實現檔案中的setWeibo方法中
只要你把這個Weibo屬性給它,它就會幫你計算frame

開始計算cell高度
//根據模型資料獲得cell的高度
WeiboFrame *f = [[WeiboFrame alloc] init];
f.weibo = _weibos[indexPath.row];
return f.cellHeight;
*WeiboCell中不需要擁有Weibo屬性,而是擁有WeiboFrame屬性,這樣既可以拿到Weibo資料,又可以拿到WeiboFrame資料
*修改settingSubviewFrame方法的代碼
//1.頭像
_icon.frame = _weiboFrame.iconF;
......


步驟總結
1>建立一個UITableViewCell的子類----WeiboCell
2>在建立cell的時候(initWithStyle:reuseIndetifier:方法中)添加cell內部需要使用的子控制項(設定只需要設定一次的在init方法裡設定)
(注意:只管建立添加子控制項,先不要去管子控制項的位置和尺寸)
3>建立一個模型類----Weibo,增加對應的資料屬性
4>給WeiboCell增加一個Weibo模型屬性,在拿到Weibo模型資料的同時設定子控制項的屬性
5>重寫setWeibo:方法:在這裡面取出Weibo模型的資料顯示到子控制項上


補充:
在viewDidLoad中註冊一個xib檔案,如果tableView通過標識在緩衝池中沒有取到可迴圈利用的Cell,就會載入MyCell1.xib檔案來建立cell
[self.tableView registerNib[UINib nibWithNibName:@"MyCell1" bundle:nil]
forCellReuseIdentifier:@"Cell"];
如此一來,就不需要再第3個資料來源方法中判斷cell是否為nil了。

iOS開發-通過代碼自訂cell

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.