iOS6.0
做iOS開(kāi)發(fā)久點(diǎn)的都知道iOS6時(shí)代,自定義控件,大多是xib文件來(lái)實(shí)現(xiàn)的,而且是通過(guò)計(jì)算frame確定subView的布局的,那個(gè)年代的人如果用純手碼的話,一般也是通過(guò)創(chuàng)建一個(gè)frameModel專(zhuān)門(mén)為subViews計(jì)算布局的.自己我就不詳解了,畢竟現(xiàn)在大多數(shù)應(yīng)用都支持iOS7+/iOS8+.
或者通過(guò)AutoResizing技術(shù),同樣在xib文件中,可以直接通過(guò)AutoResizing技術(shù),確定subView與supView間的位置關(guān)系,可讓subView隨著supView的變化而變化(比如subView固定在supView的某個(gè)角落),但是,缺陷就是,不能確定subview與subview間'兄弟控件'的關(guān)系.
iOS7.0
iOS7的到來(lái)給蘋(píng)果UI界面帶來(lái)了扁平化風(fēng)格,而針對(duì)開(kāi)發(fā)者而言, AutoLayout被引入開(kāi)發(fā),它不但能夠確定subView與supView間的關(guān)系,可能確定subview與subview間'兄弟控件'的關(guān)系.在storyboard/xib可以之間添加約束,但如果用純手碼的話,有點(diǎn)太繁瑣了,同時(shí)iOS7.0時(shí)代的AutoLayout有諸多不足.再加上國(guó)內(nèi)iOS開(kāi)發(fā)起步較晚, AutoLayout技術(shù)并沒(méi)有得到普及,應(yīng)用.
iOS8.0
iOS8+時(shí)代,隨著AutoLayout技術(shù)不斷完善,開(kāi)發(fā)者對(duì)AutoLayout的關(guān)注越來(lái)越重視,應(yīng)用越來(lái)越廣.
下面簡(jiǎn)介布局不同高度UITableViewCell的不同.
注意:AutoLayout中,UILabel盡量設(shè)置preferredMaxLayoutWidth屬性(顯示實(shí)際寬度)
UIButton對(duì)象的布局一定要全面.
iOS7 --- iOS8適用:自動(dòng)布局不同高度cell
iOS8時(shí)代,要么cell高度固定,在tableView創(chuàng)建時(shí)/代理直接設(shè)置rowHeight=固定值就可以了.但是對(duì)于不同高的cell而言,我們就要想辦法計(jì)算出cell的實(shí)際高度,告訴UITableView,下面簡(jiǎn)介自己的小思路...
xib/storyboard/純代碼 構(gòu)建 MeTypeCell時(shí),subView的與Cell.contentView的底部要無(wú)關(guān)系,因?yàn)槲覀円@取最下端subView的MAXY,來(lái)確定cell的高度. tableView.estimatedRowHeight = 200.f;//只是減少heightForRowAtIndexPath:的調(diào)用次數(shù).使heightForRow在cellForRow之后調(diào)用,對(duì)計(jì)算cell實(shí)際高度沒(méi)有任何意義.
iOS8時(shí)代,不同高度cell,可通過(guò)heightForRow方法里計(jì)算出來(lái),作為返回值,告知UITableView即可,那怎么根據(jù)數(shù)據(jù)計(jì)算呢??
首先:我們要考慮讓heightForRow調(diào)用之前,cell先顯示一下且獲取到cell對(duì)應(yīng)數(shù)據(jù),因?yàn)橹挥羞@樣cell才會(huì)根據(jù)數(shù)據(jù)進(jìn)行布局子控件,我們才能獲取到最下端subview的MaxY,那怎么辦呢,就是獲取一個(gè)假的cell,通過(guò)cell內(nèi)部布局告訴我針對(duì)indexPath位置的數(shù)據(jù),產(chǎn)生的最下端subview的MaxY.怎么做呢?? 見(jiàn)代碼.......
#import "MyTypeTableView.m"
MyTypeCell *cell;
#pragma mark - 代理方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 創(chuàng)建一個(gè)臨時(shí)的cell(目的:傳遞indexPath對(duì)應(yīng)這行的模型,布局內(nèi)部所有的子控件,得到cell的高度)
if (cell == nil) {
cell = [tableView dequeueReusableCellWithIdentifier:ID];
}
// 傳遞模型數(shù)據(jù)
cell.statusModel = self.statuses[indexPath.row];
//調(diào)用cell的方法,獲取到cell高度,返回...
return cell.cellHeight;
}
//----------------------------------------------
#import "MyTypeCell.m"
//cell提供一個(gè)計(jì)算cellHeight的方法/屬性都可.....
- (CGFloat)cellHeight
{
// 強(qiáng)制刷新(label根據(jù)約束自動(dòng)計(jì)算它的寬度和高度)
[self layoutIfNeeded];
CGFloat cellHeight = 0;
//獲取最下端MaxY
cellHeight = CGRectGetMaxY(self.bottomView.frame) + 20;// 20:bottomView到cell底邊的間距..
return cellHeight;
}
iOS9.0自動(dòng)布局不同高度cell..
1.xib/storyboard/純代碼 構(gòu)建 MeTypeCell時(shí),一定會(huì)讓subView的與Cell.contentView的底部產(chǎn)生關(guān)系(就是說(shuō),subView的底部布局,與cell底邊產(chǎn)生關(guān)系).
2.創(chuàng)建UITableView時(shí),設(shè)置兩個(gè)必要屬性,必須一起設(shè)定,這是cell總高度才會(huì)隨子控件的變化而變化.
tableView.estimatedRowHeight = 100.f;//iOS7+,估算高度,用途讓heightForRow在cellForRow之后調(diào)用,減少,UITableView開(kāi)始被加載到內(nèi)存時(shí),調(diào)用heightForRow的次數(shù),優(yōu)化內(nèi)存
tableView.rowHeight = UITableViewAutomaticDimension;// 告訴tableView所有cell的真實(shí)高度是自動(dòng)計(jì)算的(根據(jù)設(shè)置的約束)