Swift 3:不使用UIImagePickerController从照片/相机胶卷中加载照片

这个问题之前已经被问过了,但是Swift 3没有答案。我正在寻找同样的解决scheme,在过去的三个星期里,我被困住了。

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

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

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

这里是Swift 3代码的版本。

导入照片框架

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

使用此function可以在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()来pipe理授权

你可以阅读更多关于照片框架。