项目中遇到了获取本地所有图片等需求,网上也找到了很好的教程,这里在记录一下加深下印象。
多选图片使用到了一个photos
框架有一篇文章对这个框架讲解的很详细了。使用photos
框架获取到的图片类型是PHAsset
,PHAsset可以得到一些图片的具体信息,可以根据项目需要来使用。
下面进入代码部分:
首先引入 Frameworks
需要引入photos
框架。然后代码中引用包,并实现协议
import UIKit
import Photos
class SelectPhotoesViewController: PHPhotoLibraryChangeObserver {
// 数据源
private var photosArray = PHFetchResult()
获取所有图片:
func getAllPhotos() {
// 注册通知
PHPhotoLibrary.sharedPhotoLibrary().registerChangeObserver(self)
// 获取所有系统图片信息集合
let allOptions = PHFetchOptions()
// 按照时间排序
allOptions.sortDescriptors = [NSSortDescriptor.init(key: "creationDate", ascending: true)]
// 将元素集合拆解开,此时 allResults 内部是一个个的PHAsset单元
let allResults = PHAsset.fetchAssetsWithOptions(allOptions)
}
// 第一次获取相册信息,这个方法只会进入一次
func photoLibraryDidChange(changeInstance: PHChange) {
getAllPhotos()
}
接下来就是展示图片了,一般都是在colloectionView
中展示出来所有的图片:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell:SelectPhotosCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier(cellIdentifier, forIndexPath: indexPath) as! SelectPhotosCollectionViewCell
PHCachingImageManager.defaultManager().requestImageForAsset(photosArray[indexPath.row] as! PHAsset, targetSize: CGSizeZero, contentMode: .AspectFit, options: nil) { (result: UIImage?, dictionry: Dictionary?) in
// 展示图片
cell.imageView.image = result
}
return cell
}
有展示图片也需要上传图片,我在项目中上传到后台的图片数据是上传的图片的data数据,首先定义一个seletedPhotosArray
数组来保存选中的图片,接着就是获取data数据了:
func getImageData() -> NSMutableArray {
let photoArr = NSMutableArray()
for item in self.seletedPhotosArray {
PHImageManager.defaultManager().requestImageDataForAsset(item, options: nil, resultHandler: { (imageData:NSData?, dataUTI:String?, orientation:UIImageOrientation?, dictionary:Dictionary?) in
photoArr.addObject(imageData!)
})
}
return photoArr
}
然后就是根据项目需求,把数据中的图片data数据传给后台即可。