2017-07-03 8 views
5

This question has been asked before mais il n'y avait pas de réponses pour Swift 3. Je suis à la recherche de la même solution que je suis coincé pour les 3 dernières semaines.Swift 3: Charger des photos à partir de Photos/Camera Roll sans utiliser UIImagePickerController

J'ai fait mes recherches et regardé de nombreuses vidéos Youtube sur le chargement des images de Photos/Camera Roll dans l'application en utilisant UIImagePickerController mais je veux accéder aux photos sans intervention de l'utilisateur. Je veux lire une série de photos à partir de la pellicule et les mettre dans une diapositive pour les montrer une par une. Comment puis-je accéder à ces photos sans UIImagePickerController?

+0

Avez-vous essayé d'utiliser Framework Photos vous pouvez accéder aux photos de l'appareil photo rouleau ou de tout album sans utiliser imagePicker –

+0

https://developer.apple.com/library/content/samplecode/UsingPhotosFramework/Introduction/Intro.html Vérifiez ce code d'échantillon par Apple –

+0

Désolé si je sonne noob, je l'ai téléchargé et n'a pas pu fonctionner dans mon xcode 8.3. Et je n'ai aucune idée où télécharger xcode 9. – Spiral1ng

Répondre

7

Vous pouvez utiliser le cadre Photos pour extraire les photos à partir de CameraRoll/Photos. Voici la version du code Swift 3.

Importer les photos cadre

import Photos 

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

Utilisez cette fonction pour récupérer les photos, quelque part dans viewDidLoad ou sur votre action où vous voulez aller chercher les photos disponibles.

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() 
} 

Les repos sont la source de données UICollectionView et les délégués. Voir la méthode de source de données cellForItem sur Comment afficher l'image.

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 
} 

Ajustez les délégués ci-dessous en fonction de vos besoins.

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 
} 

Assurez-vous de garder la permission de photos ON. Si vous cliquez sur Ne pas autoriser, vous devez également gérer l'autorisation en utilisant PHPhotoLibrary.authorizationStatus()

Vous pouvez en savoir plus sur le cadre Photos.

+0

"Utilisez cette fonction pour récupérer les photos, quelque part dans viewDidLoad ou dans votre action, où que vous vouliez aller chercher les photos." Assurez-vous simplement que vous faites l'extraction sur un thread d'arrière-plan, puis rechargez la vue sur le fil principal! – NRitH

+0

@NRitH Exactement. –

+0

Un grand merci pour la réponse. Le code compilé sans erreur. Mais je vois un écran vide sans aucune image chargée dans l'application (l'invite d'autorisation pour accéder à Photos apparaît). J'ai ajouté un UICollectionView appelé photosCollectionView. Suis-je censé voir les photos à l'intérieur de cette UICollectionView? Désolé pour les questions. – Spiral1ng