本文自作自用笔记,不喜勿喷,诚谢纠错。
首先你需要在info.plist文件里面获取相册访问权限。http://www.cnblogs.com/lc901221/p/6599644.html
说下大概思路:首先先获取相册访问权限,然后才可以获取相册内的信息,获取到的相册数据源形式是以PHFetchResult<AnyObject>格式展示的。需要通过PHCachingImageManager(需要遵守PHPhotoLibraryChangeObserver协议)将信息转化为UIImage,这样的数据我相信所有人都会用了吧。下面时自定义的一个collectionview作的简单展示,废话不多说,直接上代码。
import UIKit
import PhotosUI
class LCPhotosGet: UIViewController,PHPhotoLibraryChangeObserver {
var photosArray = PHFetchResult<AnyObject>()
var collect:UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
self.creatUI()
self.getAllPhoto()
}
//MARK: - 创建UI显示照片
func creatUI(){
let flow = UICollectionViewFlowLayout.init()
flow.itemSize = CGSize.init(width: 50, height: 50)
flow.scrollDirection = .vertical
flow.minimumLineSpacing = 0
flow.minimumInteritemSpacing = 0
self.collect = UICollectionView.init(frame: self.view.frame, collectionViewLayout: flow)
self.view.addSubview(collect)
collect.delegate = self
collect.dataSource = self
collect.backgroundColor = UIColor.gray
collect.register(UINib.init(nibName: "PhotoCell", bundle: nil), forCellWithReuseIdentifier: "photo")
}
//MARK: - 获取所有的照片数据
func getAllPhoto(){
// 获取所有系统图片信息集合体
let allOptions = PHFetchOptions()
// 对内部元素排序,按照时间由远到近排序
allOptions.sortDescriptors = [NSSortDescriptor.init(key: "creationDate", ascending: true)]
// 将元素集合拆解开,此时 allResults 内部是一个个的PHAsset单元
let allResults = PHAsset.fetchAssets(with: allOptions)
// 将数据赋值给数据源
self.photosArray = allResults as! PHFetchResult<AnyObject>
self.collect.reloadData()
}
}
//MARK: - 遵守UICollectionView协议
extension LCPhotosGet:UICollectionViewDelegateFlowLayout,UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.photosArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "photo", for: indexPath) as! PhotoCell
PHCachingImageManager.default().requestImage(for: self.photosArray[indexPath.row] as! PHAsset, targetSize: CGSize.zero, contentMode: .aspectFit, options: nil) { (result: UIImage?, dictionry: Dictionary?) in
cell.image.image = result ?? UIImage.init(named: "iw_none")
}
cell.backgroundColor = UIColor.red
return cell
}
}
//MARK: - 遵守PHPhotoLibraryChangeObserver协议
extension LCPhotosGet{
func photoLibraryDidChange(_ changeInstance: PHChange) {
print("") //这里应该是照片库被修改后的回调,没验证过,有用过的朋友可以指点下。
}
}
上面代码中UICollectionCell是用xib拖的,这里就不展示了,也只是一个cell上有个UIImageView(展示照片)而已,相信难不倒你。
这样子你就可以访问相册了,调用这个类进行展示,可以在这个类里面添加你想要的视图。这里有个小问题,就是第一次访问的时候看不到相册,测试了几次感觉原因是没有获取相册权限。目前找到的解决方式是在上一个类进入这里之前,先获取相册权限。代码如下:
func Alert(){
//MARK: - 获取相机权限,避免第一次进入时不显示
// 获取所有系统图片信息集合体
let allOptions = PHFetchOptions()
// 对内部元素排序,按照时间由远到近排序
allOptions.sortDescriptors = [NSSortDescriptor.init(key: "creationDate", ascending: true)]
// 将元素集合拆解开,此时 allResults 内部是一个个的PHAsset单元
_ = PHAsset.fetchAssets(with: allOptions)
//MARK: - 创建提示框
let alert = UIAlertController.init()
let cleanAction = UIAlertAction(title: "取消", style: UIAlertActionStyle.cancel,handler:nil)
let choseAction = UIAlertAction(title: "从手机相册选择", style: UIAlertActionStyle.default){ (action:UIAlertAction)in
let lc = LCPhotosGet()
self.present(lc, animated: true, completion: nil)
}
alert.addAction(cleanAction)
alert.addAction(choseAction)
self.present(alert, animated: true, completion: nil)
}
如果你还需要自定义一些东西就自己添加了哈