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