2016-01-26 44 views
1

我正在使用UIImagePickerController来拍摄带有pone的照片,并稍后在应用程序中使用该照片。如何在swift中将相机视图扩展为全屏 - UIImagePickerController

这是我开始的相机代码:

imagePicker = UIImagePickerController() 
imagePicker.delegate = self 
imagePicker.sourceType = .Camera 
imagePicker.showsCameraControls = false 
imagePicker.cameraOverlayView = customViewTakePhoto() 

presentViewController(imagePicker, animated: true, completion: nil) 

这一切工作正常,相机开始,我能一次它采取去取照片,但只有一件事我想不通,那就是:

如何在拍摄照片之前在整个屏幕上进行相机查看?

这里是显示正是我需要的

这是我的看法,因为它是现在的图像(我强烈推荐这本书,顺便说一句):

enter image description here

,这就是我需要(全屏照相机视图):

enter image description here

回答

5
import UIKit 
import AVFoundation 

class CameraViewController: UIViewController { 

    // MARK: @IBOutlet 

    @IBOutlet weak var overlayCamera: UIView! 
    @IBOutlet weak var capturedImage: UIImageView! 

    // MARK: Local Variables 

    var captureSession: AVCaptureSession? 
    var stillImageOutput: AVCaptureStillImageOutput? 
    var previewLayer: AVCaptureVideoPreviewLayer? 

    // MARK: Overrides 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     previewLayer!.frame = overlayCamera.bounds 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let tapGesture = UITapGestureRecognizer(target: self, action: "cameraDidTap") 
     overlayCamera.addGestureRecognizer(tapGesture) 
    } 

    override func viewWillAppear(animated: Bool) { 
     self.navigationController?.setNavigationBarHidden(true, animated: false) 
     super.viewWillAppear(animated) 

     captureSession = AVCaptureSession() 
     captureSession!.sessionPreset = AVCaptureSessionPresetPhoto 

     let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 

     var error: NSError? 
     var input: AVCaptureDeviceInput! 
     do { 
      input = try AVCaptureDeviceInput(device: backCamera) 
     } catch let error1 as NSError { 
      error = error1 
      input = nil 
     } 

     if error == nil && captureSession!.canAddInput(input) { 
      captureSession!.addInput(input) 

      stillImageOutput = AVCaptureStillImageOutput() 
      stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] 
      if captureSession!.canAddOutput(stillImageOutput) { 
       captureSession!.addOutput(stillImageOutput) 

       previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
       previewLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill 
       previewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.Portrait 
       overlayCamera.layer.addSublayer(previewLayer!) 

       captureSession!.startRunning() 
      } 
     } 
    } 

    override func viewWillDisappear(animated: Bool) { 
     self.navigationController?.setNavigationBarHidden(false, animated: false) 
     super.viewWillDisappear(animated) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    // function for UITapGestureRecognizer for camera tap 
    func cameraDidTap() { 

     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.capturedImage.image = image 
       } 
      }) 
     } 
    } 
} 
+0

容易操纵相机,如果你使用的AVFoundation比UIImagePickerController :) –

+2

对于Swift 4 - 使用'AVCaptureSession.Preset.hd1920x1080'为全屏幕相机 –

相关问题