2016-05-11 8 views
2

Ich habe Probleme, 6 Fotos und speichern sie in einem Objekt-Array, um sie zu animieren. Ich erhalte eine Fehlermeldung,:Erstellen Sie eine Animation aus Array von Bildern

Array-Index außerhalb des zulässigen Bereichs

Auch ich erkennen, dass das „Bild“ Objekt nicht außerhalb der if-Anweisung aus irgendeinem Grunde erkannt wird. Was mache ich falsch?

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

Ihr 'picArray' ist leer und Sie versuchen, die Elemente auf bestimmte Indizes zu setzen, die nicht existieren - wollten Sie' .append() '? – Hamish

Antwort

1

picArray leer ist, so sollten Sie nicht insert Methode verwenden. Stattdessen müssen Sie die Methode append verwenden.

Der Grund, warum picArray leer ist, Sie fügen die Werte in den asynchronous Block ein. Die for-Schleife wird abgeschlossen, bevor Bilder eingefügt werden, da sie nicht darauf wartet, dass asynchrone Blöcke abgeschlossen sind.

Sie müssen warten, bis der Block asynchronous abgeschlossen ist, bevor Sie die Bildansicht animieren.

Sie können diese 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() 
    } 

} 

hoffe, das hilft mit erreichen.

Verwandte Themen