由于項(xiàng)目中需要同時(shí)選擇多張圖片作谚,但是系統(tǒng)提供的UIImagePickerController
并不支持多選鼓寺,調(diào)查了一些開源的框架打瘪,發(fā)現(xiàn)都是使用ALAssetsLibrary
庫并且都是從頭開始搭建UI啄踊,好處就是自定義強(qiáng)遭殉,壞處就是工作量大毡鉴,容易出Bug崔泵,維護(hù)方面肯定沒有Apple做的好≈硭玻基于以上所依我打算在UIImagePickerController的基礎(chǔ)上為其添加多選支持憎瘸。
思路如下:
- 要讓
UIImagePickerController
支持多選第一步我們得截獲點(diǎn)擊事件
通過
Xcode
的Debug View Hierarchy
功能我們知道系統(tǒng)使用PUCollectionView
來現(xiàn)實(shí)圖片的布局,使用PUPhotoView
來顯示一張圖片陈瘦。通過名字我們很容易猜到PUCollectionView
是繼承與UICollectionView
幌甘,順藤摸瓜知道PUPhotoView
是繼承與UICollectionViewCell
,根據(jù)以上我們就知道如何截獲點(diǎn)擊事件了,只需要重寫delegate
對象上的- (void)collectionView:(UICollectionView*)collectionView didSelectItemAtIndexPath:(NSIndexPath*)indexPath;
方法即可.
說明:在后續(xù)的調(diào)查中發(fā)現(xiàn)PUCollectionView
的delegate
并沒有響應(yīng)-(void)collectionView:(UICollectionView*)collectionView didSelectItemAtIndexPath:(NSIndexPath*)indexPath;
而是響應(yīng)了- (BOOL)collectionView:(UICollectionView*)collectionView shouldSelectItemAtIndexPath:(NSIndexPath*)indexPath;
,很明顯系統(tǒng)是直接在該方法里完成的后續(xù)操作含潘,所以我們重寫delegate
對象上的該方法就可以截獲到點(diǎn)擊事件
howitworks.png
- .在
PUPhotoView
添加選中標(biāo)記圖片AssetsPickerChecked@2x.png我們需要重寫
dataSource
對象上的- (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath;
方法即可
主要思路就是上面這兩點(diǎn)饲做,最終的效果如下:
源碼請移步Github