Kareem Arab
Kareem Arab

Reputation: 105

Create Animation from Array of images

I am having trouble taking 6 photos and storing them in an object array in order to animate them. I keep getting an error saying:

Array index out of range

Also, I realized that the "image" object isn't recognized outside the if-statement for some reason. What am I doing wrong?

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()
}

Upvotes: 2

Views: 120

Answers (1)

Surya Subenthiran
Surya Subenthiran

Reputation: 2217

picArray is empty, so you shouldn't use insert method. instead you have to use the append method.

The reason why is picArray is empty you are inserting the values inside the asynchronous block. The for loop completes before inserting images because it doesn't wait for asynchronous blocks to be complete.

You have to wait for asynchronous block to be complete before animating the image view.

You can achieve this using 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()
    }

}

Hope this helps.

Upvotes: 1

Related Questions