2017-05-22 1 views
4

Je suis nouveau dans Swift. Dans le code suivant, il récupère les photos et les place dans un tableau. Maintenant, je veux les montrer dans les images. Comment puis-je le faire?Charger des images de PHAsset dans un Imageview

Je veux dire comment, par exemple, montrer un élément du tableau dans une imageview. Une autre question est: Quand j'appelle cette fonction, il semble qu'elle s'exécute de manière asynchrone. Je veux dire que les lignes de code après avoir appelé la fonction seront exécutées tôt. Est-ce dû à requestAuthorization?

Répondre

1

Vous pouvez faire comme ceci: -

Créer un tableau vide de type PHAsset: -

fileprivate var imageAssets = [PHAsset]() 

Fetch toutes les images en appelant cette fonction: -

func fetchGallaryResources(){ 
     let status = PHPhotoLibrary.authorizationStatus() 
     if (status == .denied || status == .restricted) { 
      self.showAlert(cancelTitle: nil, buttonTitles:["OK"], title: "Oops", message:"Access to PHPhoto library is denied.") 
      return 
     }else{ 
     PHPhotoLibrary.requestAuthorization { (authStatus) in 
      if authStatus == .authorized{ 
       let imageAsset = PHAsset.fetchAssets(with: .image, options: nil) 
       for index in 0..<imageAsset.count{ 
        self.imageAssets.append((imageAsset[index])) 
       } 
     } 

    } 

Demande de l'imageComme ceci: -

let availableWidth = UIScreen.main.bounds.size.width 
let availableHeight = UIScreen.main.bounds.size.height 

Prenez l'image de ImageAssets dans une boucle ou un seul comme ça: -

PHImageManager.default().requestImage(for: imageAssets[0], targetSize: CGSize(width : availableWidth, height : calculatedCellWidth), contentMode: .default, options: nil, resultHandler: { (image, info) in 
     requestedImageView.image = image 

    }) 
+0

Lorsque j'appelle cette fonction et que je veux définir l'image dans la vue de l'image, elle soulève: erreur fatale: Index hors plage. Il l'exécution asynchrone est encore reste. –

+0

Avez-vous des images sur votre appareil? – Himanshu

+0

Oui. Je l'ai résolu en plaçant le dernier code de ligne dans la fermeture autorisée et cela fonctionne. Mais je veux le faire de manière synchrone. –

4

Essayez ceci: imageView.image = convertImageFromAsset(list[0])

func convertImageFromAsset(asset: PHAsset) -> UIImage { 
    let manager = PHImageManager.default() 
    let option = PHImageRequestOptions() 
    var image = UIImage() 
    option.isSynchronous = true 
    manager.requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: option, resultHandler: {(result, info)->Void in 
     image = result! 
    }) 
    return image 
} 

Hope it helps.

+0

intriguée pourquoi cela a été rejeté car il est le bon code – Spads

+1

Merci. il répond à ma première question. –