廢話很少說,先看一個效果圖程序員
在標籤一欄,有不少屬性須要添加,顯然都用按鈕實現太繁瑣,也不太符合程序員的風格,並且若是這些標籤須要動態設置將變得複雜,相似這樣標籤,選擇UICollectionView是比較合理的作法。函數
下面爲了敘述方便,咱們把整個的view稱爲main_view,下面的8個標籤對應的view稱爲collection_view,接下來上代碼spa
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"MainFilterView" owner:self options:nil] firstObject]; view.frame = frame; [self addSubview:view]; [_collectionView registerNib:[UINib nibWithNibName:@"MainViewFilterCollectionViewCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"MainViewFilterCollectionViewCell"]; return self; } return nil; }
在你的mainView中,你須要在initWithFrame中添加這樣的代碼,代理
[_collectionView registerNib:[UINib nibWithNibName:@"MainViewFilterCollectionViewCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"MainViewFilterCollectionViewCell"];
這裏你須要定義你的Cell,並給collection_view註冊這個view,這就至關於告訴系統每一個cell是什麼樣的。code
固然你還要在main_view中去設置整個collection_view的一些尺寸、設置一些代理、鏈接輸出口等操做,這裏只截圖作簡要說明對象
Attributes
接口
size博客
這樣只是給main_view添加了這樣一個空的collection_view,其中每一個cell用什麼填充,須要本身再寫一個XIBit
並設置尺寸io
這樣,對應的每一個cell也弄好了,就能夠運行了,固然你須要在main_view對應的m文件中實現collection_view的一些代理,
就是網上都能查到的
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
最後一個很關鍵,這裏須要返回每一個item的size,若是這個值返回的和cell的xib中不一樣,那顯示就會有問題,個人經驗是,collection_view中要設置的每一個cell的大小(在main_view的xib中)、cell對應的xib中設置的大小以及main_view對應m文件中實現的代理返回的大小應該是一致的,這樣就不會有各類顯示的問題,若是你的collection_view顯示不正常,請先確認這3個值是否相同。
在cell對應的m文件中,你須要寫這樣的代碼
- (void)awakeFromNib { [super awakeFromNib]; _labelBtnView.layer.cornerRadius = 3; self.layer.cornerRadius = 3.0; }
這裏的awakeFromNib,當.nib文件被加載的時候,會發送一個awakeFromNib的消息到.nib文件中的每一個對象,每一個對象均可以定義本身的awakeFromNib函數來響應這個消息,執行一些必要的操做。也就是說經過nib文件建立view對象時執行awakeFromNib
這裏我是在個人cell中放置了一個button,名字是_labelBtnView,有朋友可能會問,爲何不用
didSelectItemAtIndexPath,爲何這樣作之後再討論。
固然,這裏的按鈕也要鏈接一下輸入口,裏面能夠寫你的響應。若是你不須要在cell中去對這個點擊作什麼處理,那能夠定義個代理,而後在main_view的m文件中實現代理的接口,這樣,當你點擊每一個cell的時候就能夠將對cell的操做反饋給main_view,這時候main_view可能會對每一個cell的點擊進行一些處理,和上面兩排按鈕類似的操做。
至此,第一篇技術性的總結寫完了,第一次寫博客,有什麼問題,但願你們批評指正。