上一篇博客中,项目练习主要涉及到UICollectionViewDataSource,UICollectionViewFlowLayout,自定义UICollectionViewCell的知识。这篇博客中通过项目练习,你将学到:
--如何给collectionView添加header
--如何与单个cell进行交互
--如何实现同时选中多个cell
#1 添加header
1.准备工作
--新建一个文件,命名为FlickrPhotoHeaderView,继承UICollectionReusableView,并将Collection Reusable View的class设置为FlickrPhotoHeaderView。选中collectionView,勾选Section Header。
--将Collection Reusable View的高度设置为90,identifier设置为FlickrPhotoHeaderView.背景颜色设置为90%白色。
--把一个label拖到Collection Reusable View中,label的字体大小设置为32,添加两个约束Horizontal Center in Container和Vertical Center in Container。ctrl drag创建这个label的outlet。
2.添加一个数据源方法
需要说明的是kind这个参数,表示哪一种supplementary view被请求。
运行一下
#2 单选cell,图片放大 (Single Selection)
1.添加一个属性,来记录被点击的cell
--首先声明一个变量largePhotoIndexPath,它是可选类型的
--didSet起到监视的作用,当largePhotoIndexPath更新时,collectionView也随之更新。
--oldValue怎么理解? 想一下这两种情况,第一种情况是,用户先点击这个cell放大,再点击这个cell缩小;第二种情况是,用户先点击一个cell,再点击另外一个cell。这个时候,两个cell都需要加载。那么前面一个cell的indexPath值就是oldValue,它也需要添加到indexPaths数组中
--调用performBatchUpdates方法更新collectionView
2.添加UICollectionViewDelegate方法。如果选中的cell已经是large photo,那就将largePhotoIndexPath set为nil,否则就把largePhotoIndexPath set为用户选中的那个indexPath,这个时候largePhotoIndexPath不为nil,调用上面的didSet。
3.最后,来改变一下放大后cell的尺寸。
#3 多选cell (Multiple Selection)
达到的效果是:同时选中多张照片,并分享给朋友
实现思路是:
--用户点击分享按钮,告诉UICollectionView允许多选,并把分享属性设置为YES
--把用户选择的照片添加到数组中
--用户又一次点击分享按钮,分享界面出现
--当用户分享完图片或点击取消,photo被deselect,collectionView返回单一选择模式
1.添加两个属性和一个方法
2.记录分享状态。didSet在这里起观察者的作用。如果sharing为YES,navigationItem上就显示shareButton和由shareTextLabel组成的sharingDetailItem,否则,就只显示shareButton。
3.实现分享功能
--在storyboard里,拖一个UIBarButtonItem,把System Item设为Action
--添加一个方法,确保一开始searches为空,sharing也被set为No。当selectedPhotos不为空的时候,点击shareButton,弹出shareScreen。Ray Wenderlich上这里也出错了,我做了改动。
--Ok,现在假设用户要选择cell了。找到这个delegate方法?告诉collectionView现在应该select item!
--好啦,现在确定要select item,那么select item后,应该做啥呢?把选中的photo加入到selectedPhotos数组中,并且shareTextLable也要变化,以记录选中的照片的数目。
那么当用户再次点击某个item取消选择这个item的时候,是不是应该也要deselect这个item呢?首先确定要取消选择的photo是哪一张,再确定它的index,将它remove掉,并更新sharephoto的数量。
最后运行一下,是这个效果!
github项目地址:https://github.com/Paganarchitect/iOS_tutorial_exercises_RayWenderlich.git