2014-10-29 8 views
5

Sto cercando di scattare alcune foto dopo che un singolo utente ha fatto clic su un'anteprima della fotocamera in modo da poterle presentare e l'utente può sceglierne una migliore o utilizzare tutto in modalità "striscia di pellicola". L'esperienza utente prevista è: "Apro una macchina fotografica, scatta una foto e poi vedo 5 foto scattate una seconda all'altra. Non devo premere il pulsante" scatta foto "5 volte, una è sufficiente per iniziare la sequenza" .Come scattare più foto in sequenza (ritardi di 1 s ciascuna), utilizzando Swift su iOS8.1?

Sono nuovo per iOS e Swift e baso il mio lavoro su un libro "Swift Recipes" (https://www.safaribooksonline.com/library/view/ios-8-swift/9781491908969/).

Il codice sorgente per prendere una singola foto è:

controller = UIImagePickerController() 
    if let theController = controller{ 
     theController.sourceType = .Camera 
     theController.mediaTypes = [kUTTypeImage as NSString] 
     theController.allowsEditing = true 
     theController.delegate = self 
     presentViewController(theController, animated: true, completion: nil) 
    } 

più gestire l'immagine in questione (via func imagePickerController). Ho provato a giocare con il controller sopra, ma ho fallito miseramente :(Credo che questo non sia il modo giusto per ottenere quello che cerco, ma faccio fatica a trovare quello giusto.Qualsiasi aiuto sarà apprezzato

risposta

5

I non so se v'è una modalità per questo comportamento in UIImagePickerController. Se fossi in te vorrei utilizzare AVFoundation per implementare questo.

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

    var connection: AVCaptureConnection! 
    var output: AVCaptureStillImageOutput! 
    var videoPreviewLayer: AVCaptureVideoPreviewLayer! 
    @IBOutlet var videPreviewView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.createCamera() 
    } 

    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 

     self.videoPreviewLayer.bounds = self.videPreviewView.bounds 
     self.videoPreviewLayer.position = CGPoint(x: CGRectGetMidX(self.videPreviewView.bounds), y: CGRectGetMidY(self.videPreviewView.bounds)) 
    } 

    func createCamera() { 
     let captureSession = AVCaptureSession() 

     if captureSession.canSetSessionPreset(AVCaptureSessionPresetHigh) { 
      captureSession.sessionPreset = AVCaptureSessionPresetHigh 
     } else { 
      println("Error: Couldn't set preset = \(AVCaptureSessionPresetHigh)") 
      return 
     } 

     let cameraDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 

     var error: NSError? 
     let inputDevice = AVCaptureDeviceInput.deviceInputWithDevice(cameraDevice, error: &error) as AVCaptureDeviceInput 
     if let error = error { 
      println("Error: \(error)") 
      return 
     } 

     if captureSession.canAddInput(inputDevice) { 
      captureSession.addInput(inputDevice) 
     } else { 
      println("Error: Couldn't add input device") 
      return 
     } 

     let imageOutput = AVCaptureStillImageOutput() 
     if captureSession.canAddOutput(imageOutput) { 
      captureSession.addOutput(imageOutput) 
     } else { 
      println("Error: Couldn't add output") 
      return 
     } 

     // Store imageOutput. We will need it to take photo 
     self.output = imageOutput 

     let connection = imageOutput.connections.first as AVCaptureConnection! 
     // Store this connection in property. We will need it when we take image. 
     self.connection = connection 
     connection.videoOrientation = AVCaptureVideoOrientation.Portrait 

     captureSession.startRunning() 

     // This will preview the camera 
     let videoLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
     videoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
     videoLayer.contentsScale = UIScreen.mainScreen().scale 

     self.videPreviewView.layer.addSublayer(videoLayer) 

     // Store this layer instance in property. We will place it into a view 
     self.videoPreviewLayer = videoLayer 
    } 

    func takePhoto(completion: (UIImage?, NSError?) -> Void) { 
     self.output.captureStillImageAsynchronouslyFromConnection(self.connection) { buffer, error in 
      if let error = error { 
       completion(nil, error) 
      } else { 
       let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer) 
       let image = UIImage(data: imageData, scale: UIScreen.mainScreen().scale) 
       completion(image, nil) 
      } 
     } 
    } 
} 

Ora tutto ciò che dovete fare è creare un'azione che chiama takePhoto con 3 volte È possibile utilizzare NSTimer per fare ciò.

+0

Come chiamare takePhoto con UIButton? – Slavcho

Problemi correlati