因為公司項目的計算高度library杜秸,經(jīng)常在ios7的幾個little version上發(fā)生crash,特發(fā)此文陆蟆。
要求Version >= IOS7.0
高度計算的歷程
<pre>
- calucate manully,通過
[self.userComment.text boundingRectWithSize:<#(CGSize)#> options:<#(NSStringDrawingOptions)#> attributes:<#(nullable NSDictionary<NSString *,id> *)#> context:<#(nullable NSStringDrawingContext *)#>]<bre>
[self.userComment sizeThatFits:<#(CGSize)#>];
這樣的方法來計算高度贞言,最后把各種 margin 蛛淋、labelHeight句狼、textviewHeigt加在一起呐粘,逐步計算岗宣。
- 在AutoLayout大家都認可之后蚂会,開始使用systemLayoutSizeFittingSize來計算高度
- 然后就是iOS8的 self-sizing cell ,使用 frame layout 和 auto layout 都可以耗式。
self.tableView.estimatedRowHeight = 213;
self.tableView.rowHeight = UITableViewAutomaticDimension;
</pre>
好了下面進入正題胁住。
首先計算高度趁猴,如果是固定高度,強烈推薦使用self.tableView.rowHeight
這個屬性來設(shè)置高度彪见,這樣就避免了儡司,計算。讓界面更加的流暢余指,你懂得捕犬。
如果你重寫了代理方法。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
剛開始設(shè)置的屬性會被覆蓋酵镜。
下一個設(shè)置cell height的方法是self.tableView.estimatedRowHeight
和代理方法-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
這兩個東西碉碉,也提高了tableview的性能,當(dāng)數(shù)據(jù)很多時淮韭,讓它不是那么卡頓垢粮。
為什么?以前都是根據(jù)數(shù)據(jù)源的個數(shù)靠粪,剛開始就計算所有的高度蜡吧。有了它之后呢,只有當(dāng)滑動到這里的時候才計算占键。
next is -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
在這里我們計算的時候我們需要一個專門來計算高度的cell斩跌,為什么呢,因為計算方法是view
的一個實例方法在此方法里面捞慌。而且在-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
方法里耀鸦,cell的重用失效了···,這個很奇怪哈啸澡。
我們可以定義一個static 的cell來袖订,使用它的實例方法[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]
計算size,
在此之前調(diào)用一下更新約束的方法[cell layoutIfNeeded];
讓計算更可靠點。
不過這里有個注意點嗅虏,在有多行l(wèi)abel的時候洛姑,需要指定它的寬度像這樣self.userComment.preferredMaxLayoutWidth = 293;
否則它是不會換行的。
這樣計算下來高度還是不對皮服,為什么呢楞艾?
高度還差1
,因為你計算的時contentview
的高度龄广,cell
的實際高度比contentview
的高度還高1
哦硫眯。
這種方法和以前相比已經(jīng)方便很多了,但是择同,計算的速度沒有手算的快两入,所以如果考慮不到位,卡頓現(xiàn)象就會很明顯敲才。
上面的方法需要同學(xué)對約束掌握熟練裹纳,保證上下左右都有約束支撐择葡。特別是在視圖很多的時候,約束很可能出現(xiàn)沖突剃氧,大家要靈活的運用priority
敏储、content hugging
、content compression
朋鞍,這些屬性解決沖突
有不足的地方請同學(xué)補充虹曙,謝謝。需要demo的同學(xué)留下地址
Tip
因為UILabel和UITextView番舆,都存在多行展示的問題,所以要下知道最大寬度矾踱,這里我們可以這樣
- (void)layoutSubviews
{
[super layoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[super layoutSubviews];
}
第一次調(diào)用[super layoutSubviews]
是為了獲得label現(xiàn)在的真實frame恨狈,第二次調(diào)用是為了更新布局。