UICollectionView总结及简单应用(下)

来源:互联网 时间:2017-01-22


上一篇博客中,项目练习主要涉及到UICollectionViewDataSource,UICollectionViewFlowLayout,自定义UICollectionViewCell的知识。这篇博客中通过项目练习,你将学到:

--如何给collectionView添加header

--如何与单个cell进行交互

--如何实现同时选中多个cell

#1 添加header

1.准备工作

--新建一个文件,命名为FlickrPhotoHeaderView,继承UICollectionReusableView,并将Collection Reusable View的class设置为FlickrPhotoHeaderView。选中collectionView,勾选Section Header。



勾选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.添加一个数据源方法



FlickrPhotosViewController.swift

需要说明的是kind这个参数,表示哪一种supplementary view被请求。

运行一下



simulator
#2 单选cell,图片放大 (Single Selection)

1.添加一个属性,来记录被点击的cell



FlickrPhotosViewController.swift

--首先声明一个变量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。



FlickrPhotosViewController.swift

3.最后,来改变一下放大后cell的尺寸。



FlickrPhotosViewController.swift
#3 多选cell (Multiple Selection)

达到的效果是:同时选中多张照片,并分享给朋友

实现思路是:

--用户点击分享按钮,告诉UICollectionView允许多选,并把分享属性设置为YES

--把用户选择的照片添加到数组中

--用户又一次点击分享按钮,分享界面出现

--当用户分享完图片或点击取消,photo被deselect,collectionView返回单一选择模式

1.添加两个属性和一个方法



selectedPhotos记录用户选中的照片

调用此方法,能看到选中的照片的数目

2.记录分享状态。didSet在这里起观察者的作用。如果sharing为YES,navigationItem上就显示shareButton和由shareTextLabel组成的sharingDetailItem,否则,就只显示shareButton。



添加sharing属性来记录分享状态

3.实现分享功能

--在storyboard里,拖一个UIBarButtonItem,把System Item设为Action

--添加一个方法,确保一开始searches为空,sharing也被set为No。当selectedPhotos不为空的时候,点击shareButton,弹出shareScreen。Ray Wenderlich上这里也出错了,我做了改动。



--Ok,现在假设用户要选择cell了。找到这个delegate方法?告诉collectionView现在应该select item!



FlickrPhotosViewController.swift

--好啦,现在确定要select item,那么select item后,应该做啥呢?把选中的photo加入到selectedPhotos数组中,并且shareTextLable也要变化,以记录选中的照片的数目。

那么当用户再次点击某个item取消选择这个item的时候,是不是应该也要deselect这个item呢?首先确定要取消选择的photo是哪一张,再确定它的index,将它remove掉,并更新sharephoto的数量。



添加两个代理方法

最后运行一下,是这个效果!



simulator

github项目地址:https://github.com/Paganarchitect/iOS_tutorial_exercises_RayWenderlich.git




相关阅读:
Top