開篇語:
有些人可能會問了,難道我的view不支援自動布局? 不不,你的view當然支援,隻不過它不像UILabel、UIButton一樣,随着自身内容的變化決定其大小,俗稱:自适應大小。簡單來說,1個字隻需要一行顯示,高度20像素。但是,如果你動态指派給label 100個字,那寬度、高度都肯定要變化,所有相關元件的frame都需要變化。當然,這個工作是由autolayout來完成的。那麼,如何讓你的自定義view也同樣支援上述功能呢?
實作:
下面我們要講的是:intrinsicContentSize 讓你的view重寫這個它的get方法,傳回你希望的大小(當然,一般是跟着内容大小變化的),這樣auto layout即可響應布局變化。
//通過覆寫intrinsicContentSize函數修改View的大小
-(CGSize)intrinsicContentSize{
return CGSizeMake(100,200);
}
這裡傳回的size非常關鍵,它表示你目前view的固定大小。如果你的view沒有大小,應該使用預設值UIViewNoIntrinsicMetric代替。可能有人問了,如果我的view的内容發生了變化,如何才能讓auto layout生效呢?
首先,你需要修改你傳回的intrinsicContentSize的大小,其次,你需要調用:
[self invalidateIntrinsicContentSize];
這樣auto layout就會自動得到最新的size啦!
那什麼時候觸發invalidateIntrinsicContentSize比較合适呢? 當然是layoutSubviews裡最合适:
- (void)layoutSubviews {
[super layoutSubviews];
//計算content size
……
//讓auto layout重新布局
[self invalidateIntrinsicContentSize];
}
你的自定義view在addSubview等情況時,都會觸發layoutSubview,然後按照你的業務邏輯計算 content size即可。寫了這麼多,下一篇文章我會介紹如何讓WKWebView實作自動布局(随着内容自動更新高度),盡請期待。