2016-05-11 6 views
2

6枚の写真をアニメーション化するためにオブジェクト配列に格納する際に問題があります。範囲イメージの配列からアニメーションを作成する

のうち

配列のインデックスはまた、私は「画像」のオブジェクトが何らかの理由でif文の外に認識されていないことに気づいた:私はというエラーを取得しておきます。私は間違って何をしていますか?

func didPressTakePhoto(){ 

    var picArray: [UIImage] = [] 

    for index in 1...6 { 

     if let videoConnection = stillImageOutput?.connectionWithMediaType(AVMediaTypeVideo){ 
      videoConnection.videoOrientation = AVCaptureVideoOrientation.Portrait 
      stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: { 
       (sampleBuffer, error) in 

        if sampleBuffer != nil { 


         let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) 
         let dataProvider = CGDataProviderCreateWithCFData(imageData) 
         let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault) 

         let image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right) 

         self.tempImageView.image = image 
         self.tempImageView.hidden = false 

         UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); 

         picArray[index] = image; 
        } 

      }) 

     } 
    } 
    self.gifView.animationImages = picArray; 
    self.gifView.animationDuration = 1.0 
    self.gifView.startAnimating() 
} 
+1

あなたの 'picArray'は空であり、存在しない与えられたインデックスで要素を設定しようとしています - あなたは' .append() 'を使うつもりでしたか? – Hamish

答えて

1

picArrayあなたがinsertメソッドを使用してはならないので、空です。代わりにappendメソッドを使用する必要があります。

picArrayが空である理由は、asynchronousブロック内の値を挿入する理由です。 forループは、非同期ブロックが完了するのを待たずに画像を挿入する前に完了します。

イメージビューをアニメーション化する前に、asynchronousブロックが完了するまで待つ必要があります。

あなたはdispatch_group

func didPressTakePhoto(){ 

    var picArray: [UIImage] = [] 

    let dispatchGroup = dispatch_group_create() 

    for index in 1...6 { 

     dispatch_group_enter(dispatchGroup) 

     if let videoConnection = stillImageOutput?.connectionWithMediaType(AVMediaTypeVideo){ 
      videoConnection.videoOrientation = AVCaptureVideoOrientation.Portrait 
      stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: { 
       (sampleBuffer, error) in 

       if sampleBuffer != nil { 


        let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) 
        let dataProvider = CGDataProviderCreateWithCFData(imageData) 
        let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault) 

        let image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right) 

        self.tempImageView.image = image 
        self.tempImageView.hidden = false 

        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); 

        picArray.append(image); 
       } 

       dispatch_group_leave(dispatchGroup) 

      }) 

     } else { 
      dispatch_group_leave(dispatchGroup) 
     } 
    } 

    dispatch_group_notify(dispatchGroup, dispatch_get_main_queue()) { 
     self.gifView.animationImages = picArray; 
     self.gifView.animationDuration = 1.0 
     self.gifView.startAnimating() 
    } 

} 

を使用してこれを達成することができますが、この情報がお役に立てば幸いです。

関連する問題