废话很少说,先看一个效果图程序员
在标签一栏,有不少属性须要添加,显然都用按钮实现太繁琐,也不太符合程序员的风格,并且若是这些标签须要动态设置将变得复杂,相似这样标签,选择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的点击进行一些处理,和上面两排按钮类似的操做。
至此,第一篇技术性的总结写完了,第一次写博客,有什么问题,但愿你们批评指正。