前因
Xcode升級后,發(fā)現跑舊項目調試遇到自定義View部分會卡死,找到原因是在layoutSubviews給self.frame賦值,導致循環(huán)調用。
其實在我們的項目中,難免會用到自動布局,簡單的使用frame就可以搞定,但是復雜的控件,如果外面用的自動布局,自定義控件使用frame就很復雜。
一般我們都會在View內部算好大小,通知外部去更新布局,這種方案是可以實現,但是復雜了點。我們希望自定義的View像UILabel那樣,autolayout時方便快捷。
在了解如何讓自定義View支持自動布局,我們需要了解intrinsicContentSize這個屬性,也就是控件的內置大小。比如UILabel,UIButton等控件,他們都有自己的內置大小。控件的內置大小往往是由控件本身的內容所決定的,比如一個UILabel的文字很長,那么該UILabel的內置大小自然會很長??丶膬戎么笮】梢酝ㄟ^UIView的intrinsicContentSize屬性來獲取內置大小,也可以通過invalidateIntrinsicContentSize方法來在下次UI規(guī)劃事件中重新計算intrinsicContentSize。如果直接創(chuàng)建一個原始的UIView對象,顯然它的內置大小為0。
那么我們就可以使用這個屬性來讓我們的View支持自動布局,只需要簡單的幾步
1、重寫intrinsicContentSize返回內部大小
2、在大小變化的時候調用 invalidateIntrinsicContentSize 通知內部大小變化。
后果
于是就有了下面這個自定義的tagView
1、支持自動布局,不需要計算高度,也不需要指定frame,自適應高度
2、支持單行,多行顯示
3、支持分頁顯示
4、支持單選,多選,禁用選擇
5、支持添加和刪除Tag
6、支持字典數據類型
使用也比較簡單
// 創(chuàng)建
self.tagView = [[TTTagView alloc] init];
[self.view addSubview:self.tagView];
// 布局
[self.tagView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(16);
make.left.right.mas_equalTo(0);
}];
// 指定數據
self.tagView.tagsArray = @[@"林俊杰",@"張學友",@"劉德華",@"陶喆",@"王力宏",@"王菲",@"Taylor swift",@"周杰倫",@"owl city",@"汪蘇瀧",@"許嵩",@"李代沫",@"那英",@"羽泉",@"刀郎",@"田馥甄",@"莊心妍",@"林宥嘉",@"薛之謙",@"蕭敬騰",@"王若琳"];
// 指定默認選中的數據(可選)
self.tagView.defaultSelectTags = @[@"羽泉"];
// 獲取選中的數據
NSArray *selectTags = self.tagView.selectTags;