2017-01-29 14 views
1

私は現在、楽しみのためのカメラアプリケーションを構築しようとしており、問題に遭遇しました。AVCapturePhotoCaptureDelegateから写真データを取得

アップルが写真やビデオの撮影プロセスのために提供している例を使用していました。ここで見つける:

https://developer.apple.com/library/content/samplecode/AVCam/Introduction/Intro.html

私はPhotoCaptureDelegateを使用して問題を抱えています。したがって、現在ユーザーが写真を撮ると、ユーザーの写真ライブラリに保存されます。私がしたいことは、写真をキャプチャした後です。写真を保存するphotoDataオブジェクトです。あなたがそれを保存する前にプレビューとして別のビューに写真を表示することができます。

これは、Appleが使用することを示唆するものである:

func capture(_ captureOutput: AVCapturePhotoOutput, didFinishCaptureForResolvedSettings resolvedSettings: AVCaptureResolvedPhotoSettings, error: Error?) { 
    if let error = error { 
     print("Error capturing photo: \(error)") 
     didFinish() 
     return 
    } 

    guard let photoData = photoData else { 
     print("No photo data resource") 
     didFinish() 
     return 
    } 

    PHPhotoLibrary.requestAuthorization { [unowned self] status in 
     if status == .authorized { 
      PHPhotoLibrary.shared().performChanges({ [unowned self] in 
        let creationRequest = PHAssetCreationRequest.forAsset() 
        creationRequest.addResource(with: .photo, data: photoData, options: nil) 

        if let livePhotoCompanionMovieURL = self.livePhotoCompanionMovieURL { 
         let livePhotoCompanionMovieFileResourceOptions = PHAssetResourceCreationOptions() 
         livePhotoCompanionMovieFileResourceOptions.shouldMoveFile = true 
         creationRequest.addResource(with: .pairedVideo, fileURL: livePhotoCompanionMovieURL, options: livePhotoCompanionMovieFileResourceOptions) 
        } 

       }, completionHandler: { [unowned self] success, error in 
        if let error = error { 
         print("Error occurered while saving photo to photo library: \(error)") 
        } 

        self.didFinish() 
       } 
      ) 
     } 
     else { 
      self.didFinish() 
     } 
    } 
} 

は、どのように私は私のデリゲートからphotoDataオブジェクトを取るだろうとバックこのデリゲートに呼びかけている私のビューコントローラにそれを渡しますか?

答えて

1

これを解決する方法がいくつかあります。また、あなたのView Controllerに写真キャプチャデリゲート(Appleの例のような)を持たせて、写真を撮った後にバックアップを渡すこともできます。また、あなたのビューコントローラを写真キャプチャデリゲートにして、何も渡す心配はありません!

1)バックアップ写真を渡し

これを行うには(再び)カップルの方法があります。デリゲートがコントローラに値を返すようにすることができます。デリゲートにコントローラーにそれが完了したことを伝えるようにさせ、コントローラーに写真をつかわせることもできます。私は下の2番目の方法を説明します。

アップルの例を見ると、コントローラが完了したらPhotoCaptureDelegateがすでにコントローラに通知していることがわかります! PhotoCaptureDelegateオブジェクトが作成されるたびに、completedブロックが渡されます。

コントローラが写真をつかむためには、写真のオブジェクトを公開する必要があります。 AVCapturePhotoCaptureDelegateとして

... 
    , completed: { [unowned self] photoCaptureDelegate in 
     self.sessionQueue.async { [unowned self] in 
      self.inProgressPhotoCaptureDelegates[photoCaptureDelegate.requestedPhotoSettings.uniqueID] = nil 
      if let photoData = photoCaptureDelegate.photoData { 
       // You now have the photo data! 
       // You can pass this to another method in the Controller now     
      } 
     } 
    } 
    ... 

2)ビューコントローラ:あなたはcompletedブロックを定義するとき

  1. 変更PhotoCaptureDelegateprivate var photoData: Data? = nilCameraViewControllerpublic var photoData: Data? = nil
  2. であることを、あなたは今、写真データを持っています

    これを解決する別の方法は、ViewControllerAVCapturePhotoCaptureDelegateにすることです。それから、あなたはすでにビューコントローラに写真データを持っています!私は今、しばらくこれで苦労されていますありがとうございました

    class MyViewController: UIViewController, AVCapturePhotoCaptureDelegate { 
    
        ... 
    
        func capture(_ captureOutput: AVCapturePhotoOutput, didFinishCaptureForResolvedSettings resolvedSettings: AVCaptureResolvedPhotoSettings, error: Error?) { 
         guard let photoData = photoData else { 
          return 
         } 
         // You now have your photo data! 
        } 
    } 
    
+0

!!!!:それはこのような何かを見ることができます – scouty

関連する問題