2015-12-23 1 views
0

Lorsque vous essayez de charger et d'afficher une vignette d'une photo qui vient d'être prise comme ceci:Affichage de la miniature après shooting photo à Swift 2

func photom(){ 

    if let videoConnection = self.stillImageOutput.connectionWithMediaType(AVMediaTypeVideo) { 

     self.stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) { (imageDataSampleBuffer, error) -> Void in 

      let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer) 
      let lPhoto = UIImage(data: imageData) 
      var imageIdentifier: String? 

      PHPhotoLibrary.sharedPhotoLibrary().performChanges({() -> Void in 

       let changeRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(lPhoto!) 
       let placeHolder = changeRequest.placeholderForCreatedAsset 
       imageIdentifier = placeHolder!.localIdentifier 

      }, completionHandler: { success, error in 

       if success { 

        self.currentSelectedID = imageIdentifier! 
        self.makeSelectedItemButton(0) 

        return 
       } 
      }) 
     } 
    } 
} 

makeSelectedItemButton() est:

func makeSelectedItemButton(layConst: CGFloat){ 

    if let selButto = view.viewWithTag(6){ 
     selButto.removeFromSuperview() 
    } 

    PhotoHelper().getThumbnailWithIdentifer(currentSelectedID, groesse: CGSize(width: cellHocR ,height: cellHocR), completion: { (image) -> Void in 

     if image != nil { 
      let libView = UIImageView() 

      libView.frame = CGRectMake(self.abstanR, self.abstanR, 22, 22) 
      libView.layer.cornerRadius = 11 
      libView.clipsToBounds = true 
      libView.contentMode = .ScaleAspectFill 
      libView.image = image 

      let libButton = UIButton() 
      libButton.backgroundColor = UIColor.clearColor() 
      libButton.tag = 6 
      libButton.frame = CGRectMake(0+layConst, self.view.frame.height-self.cellHocR, self.cellHocR, self.cellHocR) 
      libButton.addTarget(self, action: "libTap:", forControlEvents: .TouchUpInside) 
      libButton.insertSubview(libView, atIndex: 0) 
      self.view.addSubview(libButton) 

     } 
    }) 
} 
.

Et PhotoHelper() getThumbnailWithIdentifer est:

func getThumbnailWithIdentifer(localIdentifier:String, groesse: CGSize, completion: (image:UIImage?) -> Void) { 

    let manager = PHImageManager.defaultManager() 
    let fetchOptions = PHFetchOptions() 
    fetchOptions.predicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.Image.rawValue) 

    let fetchResults = PHAsset.fetchAssetsWithLocalIdentifiers([localIdentifier], options: fetchOptions) 

    if fetchResults.count > 0 { 

     if let imageAsset = fetchResults.objectAtIndex(0) as? PHAsset { 

      let requestOptions = PHImageRequestOptions() 
      requestOptions.synchronous = true 
      requestOptions.deliveryMode = .HighQualityFormat 
      manager.requestImageForAsset(imageAsset, targetSize: groesse, contentMode: .AspectFit, options: requestOptions, resultHandler: { (image, info) -> Void in 
       completion(image: image) 
       print(image!.size) 
      }) 

     } else { 

      completion(image: nil) 
     } 

    } else { 

     completion(image: nil) 
    } 
} 

Cela provoque l'affichage du bouton au moins 5 secondes après la prise de vue. Les mêmes fonctions fonctionnent rapidement et comme prévu lorsqu'elles sont exécutées avec des photos plus anciennes. Quel est le problème ici?

Répondre

0

Pourriez-vous attendrez en raison de la ligne suivante dans getThumbnailWithIdentifer:

requestOptions.synchronous = true 

Vous pouvez changer à false et vous pourriez essayer d'utiliser une image miniature de l'espace réservé jusqu'à ce que les rendements réels des vignettes?

+0

Désolé, j'ai résolu le problème il y a longtemps avec un dispatch_after. Je ne sais pas si votre solution fonctionne, mais merci! – HansiOber