天天看點

讓你的自定義view支援自動布局----Auto Layout開篇語:實作:

開篇語:

有些人可能會問了,難道我的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實作自動布局(随着内容自動更新高度),盡請期待。