Swift 3:在不使用UIImagePickerController的情况下从照片/相机胶卷加载照片

时间:2017-07-03 03:00:35

标签: ios swift xcode photos

This question has been asked before但是Swift 3没有答案。我正在寻找过去3周内遇到的相同解决方案。

我已经完成了我的研究并观看了许多关于使用UIImagePickerController将照片/相机胶卷中的图像加载到应用程序中的Youtube视频,但我想在没有用户操作的情况下访问这些照片。

我想从相机胶卷中读取一系列照片并将它们放在照片幻灯片中,逐一显示。如何在没有UIImagePickerController的情况下访问这些照片?

1 个答案:

答案 0 :(得分:18)

您可以使用Photos框架从CameraRoll / Photos中获取照片。

以下是 Swift 3 代码的版本。

导入照片框架

import Photos

//Array of PHAsset type for storing photos
var images = [PHAsset]()

使用此功能可以在viewDidLoad中的某个位置或您想要获取照片的操作中获取照片。

func getImages() {
    let assets = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: nil)
    assets.enumerateObjects({ (object, count, stop) in
       // self.cameraAssets.add(object)
        self.images.append(object)
    })

    //In order to get latest image first, we just reverse the array
    self.images.reverse() 

    // To show photos, I have taken a UICollectionView       
    self.photosCollectionView.reloadData()
}

其余是UICollectionView数据源和代理。请参阅如何显示图像的cellForItem数据源方法。

 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
       return images.count
    }

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoCollectionViewCell", for: indexPath) as! PhotoCollectionViewCell
    let asset = images[indexPath.row]
    let manager = PHImageManager.default()
    if cell.tag != 0 {
            manager.cancelImageRequest(PHImageRequestID(cell.tag))
        }
    cell.tag = Int(manager.requestImage(for: asset,
                                            targetSize: CGSize(width: 120.0, height: 120.0),
                                            contentMode: .aspectFill,
                                            options: nil) { (result, _) in
                                                cell.photoImageView?.image = result
        })
    return cell
}

根据需要调整以下代表。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = self.view.frame.width * 0.32
    let height = self.view.frame.height * 0.179910045
    return CGSize(width: width, height: height)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 2.5
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 0
}

确保照片权限开启。如果单击“不允许”,则必须使用PHPhotoLibrary.authorizationStatus()

管理授权

您可以阅读有关Photos框架的更多信息。