由于项目中需要同时选择多张图片,但是系统提供的UIImagePickerController
并不支持多选,调查了一些开源的框架,发现都是使用ALAssetsLibrary
库并且都是从头开始搭建UI,好处就是自定义强,坏处就是工作量大,容易出Bug,维护方面肯定没有Apple做的好。基于以上所依我打算在UIImagePickerController的基础上为其添加多选支持。
思路如下:
- 要让
UIImagePickerController
支持多选第一步我们得截获点击事件
通过
Xcode
的Debug View Hierarchy
功能我们知道系统使用PUCollectionView
来现实图片的布局,使用PUPhotoView
来显示一张图片。通过名字我们很容易猜到PUCollectionView
是继承与UICollectionView
,顺藤摸瓜知道PUPhotoView
是继承与UICollectionViewCell
,根据以上我们就知道如何截获点击事件了,只需要重写delegate
对象上的- (void)collectionView:(UICollectionView*)collectionView didSelectItemAtIndexPath:(NSIndexPath*)indexPath;
方法即可.
说明:在后续的调查中发现PUCollectionView
的delegate
并没有响应-(void)collectionView:(UICollectionView*)collectionView didSelectItemAtIndexPath:(NSIndexPath*)indexPath;
而是响应了- (BOOL)collectionView:(UICollectionView*)collectionView shouldSelectItemAtIndexPath:(NSIndexPath*)indexPath;
,很明显系统是直接在该方法里完成的后续操作,所以我们重写delegate
对象上的该方法就可以截获到点击事件
- .在
PUPhotoView
添加选中标记图片我们需要重写
dataSource
对象上的- (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath;
方法即可
主要思路就是上面这两点,最终的效果如下:
源码请移步Github