最近在将公司项目进行重构,主要是领导说把H5界面写的全都改成原生来写。于是这工作量和工作难度成倍增长。所以,在看到UI的时候,首先是想好自己要怎么写能够最简单且高效,还能够没有冗余代码。在项目中,纯手写代码,不用storyboard也不用Xib文件,在我看来手写代码比拖动那些视图布局要比Xib那些稳妥很多,尽管代码量相比起来前者更多。
cell.backgroundView和selectedBackgroundView好了,回归正题。上图就是我项目里一个界面的一部分,这个部分要实现的功能是,点击按钮,按钮就会改变不同的图片,前一张点击的(非重复)图片保持不变,这部分我是这样布局的。
数组里保存的是图片名 创建collectionView并实现其require delegate我手写布局习惯了用sd_layout这个第三方库,尽管用起来偶尔有小坑,但是还是不影响其整体使用。上面两个数组都是保存的图片名,defaultArray按顺序(周日--周一)保存的是未选中时的图片,changeArray则是按顺序(周日--周一)保存的是选中时的图片。
有些人觉得可能直接写7个button更加快速,但是collectionView有那么多优秀的属性,何乐而不用呢?大家在看到UIcollectionViewCell的那个方法时,就会发现我已经将cell的backgroundView逐一设置成了未选中的图片,其selectedBackgroundView设置成了选中的图片,当然,在不做任何操作的情况下,cell的背景图片的是backgroundView。这样一来我们就省去了在使用button点击时的不少判断了。
我这个界面刚开始是根据服务器获取的数据来判断是否是选中状态的,那么拿来做判断的数据也就是创建collectionView时那段代码里的weekArray啦。weekArray是保存的0-6的数字,具体是哪些就要看用户设置的周几了,0代表设置的是周日,依次类推到周六。
关键方法用到这个selectItemAtIndexPath:index animated:YES scrollPosition:UICollectionViewScrollPositionTop方法,index表示将cell里哪个row选中,scrollposition是一个enum类型,具体有哪些大家可以点进去它的官方文档查看,这里不再做赘述。
注意:在创建UICollectionView时,它的allowsMultipleSelection属性一定设置成YES。
方便之处还有就是大家不需要记录哪些是已经被选中的,大家只需要调用collectionView自带的方法就可以获取到被选中的是哪些cell,如下图:
调用高亮的那个方法获取cell中被选中的row在此,我这小部分的UI和功能就全部实现了。是不是写起来比循环创建7个button有效简单的多呢?
菜鸟第一次写技术文档,若有不当之处,望多指正。
网友评论