本文自作自用笔记,不喜勿喷,诚谢纠错。

首先你需要在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)

}

如果你还需要自定义一些东西就自己添加了哈