前言
最近项目里需要实现一种效果,就是一类标签放一块,可以分多种类别,只能选中一个标签,而且选中标签要改背景、颜色、字体等;开始觉得挺好实现的,标签打开类似于好友列表界面,选中系统带的有,但是实际操作起来遇到好多麻烦,跑远了,贴上一张帅照
首先给一张我们的需求图
再给一个我们实现之后的效果动图
具体实现过程
1. 实现过程中遇到的问题
开始我用 btn 做的,在Button中的点击方法中改变他的状态,然后在懒加载的时候 button 的各种颜色字体啦都处理好,然后我想通过传过去在 controller里边通过button的 selected来实现这些效果,初级效果实现了,但是效果很不理想,因为没有考虑到cell复用的因素,导致选中的 item 不固定,在你点击 header打开再关闭的时候,选中的cell会跑,很神奇吧,所以我们的选中效果要放到collectionView 上做。
2.具体实现
首先要解决的是item会跑的问题,我们只需要在定义cell时候记住他的状态就行,所以我在自定义的 cell 类的 . h 里设一个BOOL类型的selected属性,并且在 . m 文件里写setter方法
@synthesize beSelected = _beSelected;
- (BOOL)isBeSelected
{
return _beSelected;
}
- (void)setBeSelected:(BOOL)beSelected
{
_beSelected = beSelected;
self.categoryLabel.backgroundColor = _beSelected?RGBA(42.0, 144.0, 215.0, 1):[UIColor whiteColor];
self.categoryLabel.textColor = _beSelected?[UIColor whiteColor]:[UIColor blackColor];
self.categoryLabel.layer.borderColor = RGBA(233.0, 233.0, 233.0, 1.0).CGColor;
self.categoryLabel.layer.borderWidth = 0.5;
}
下面我们就需要在 controller里边做处理了
其中中心思想就是找到我们点击的那个 cell 并且更改他的selected属性,而剩余的cell的的状态都要保证未打开,所以我们就整一个数组放状态信息,
注:那个cnt<50 不用太关注,他只要大于等于你的所有 cell的和就行
下一步就是在 collectionView 的代理方法中实现 cell 初始化的设定
具体我是for 循环出来点击 cell 改变他的selected=!_selected,然后剩余的都设成0。
好了到了这一步基本上都完成了,喜欢的点一个赞。
PS :我没有写 header 点击打开section 应该大家都会所以就不写了