separar por organizar ordenar mover fotos fecha como carrete camara ios swift uiview ios8 avcapturesession

ios - por - Cómo configurar la vista de la cámara para que llene la vista principal



organizar fotos iphone 6 (5)

Debe realizar la configuración una vez que se hayan distribuido sus subvistas. En viewDidLayoutSubviews

-(void)viewDidLayoutSubviews { [self setupAVCapture]; } - (void)setupAVCapture { NSError *error = nil; AVCaptureSession *session = [AVCaptureSession new]; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) [session setSessionPreset:AVCaptureSessionPreset640x480]; else [session setSessionPreset:AVCaptureSessionPresetPhoto]; // Select a video device, make an input AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; if ([session canAddInput:deviceInput]) [session addInput:deviceInput]; AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:session]; [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; previewLayer.frame = self.camView.bounds; [self.camView.layer addSublayer:previewLayer]; [session startRunning]; }

Lo que probablemente le estaba sucediendo es que los límites aún no se habían establecido con precisión en su viewDidLoad ya que las subvistas aún no se han establecido de acuerdo con sus limitaciones. Cuando, en cambio, configura el marco para el previewLayer en viewDidLayoutSubviews , adoptará la orientación correcta. Sin embargo, tenga cuidado, también deberá ajustar la vista previa de rotación y lo que no, y modificar el código que usé. Lo siento, no es rápido, pero eso no debería importar. Simplemente mueva su creación de instancias y configure en viewDidLayoutSubviews

Entonces para tu código, deberías hacer algo como esto:

override func viewDidLayoutSubviews() { ... previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as! AVCaptureVideoPreviewLayer previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill previewLayer.frame = self.camView.layer.bounds self.camView.layer.addSublayer(previewLayer) session.startRunning()

No sé si este problema es algo relacionado con el diseño automático o si estoy haciendo algo mal.
Tengo un UIViewController y un UIView dentro de él.
Y estoy usando AVCaptureSession para poner la vista de la cámara dentro de ella.
El problema es que cuando la vista de la cámara se carga dentro de la vista, no llena esa vista, así que tengo espacios en el lado izquierdo y derecho.
Lo que estoy tratando de hacer es llenar todo UIView con la cámara.
Este es mi código:

... @IBOutlet weak var camView: UIView! var previewLayer : AVCaptureVideoPreviewLayer! override func viewDidLoad() { ... previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as! AVCaptureVideoPreviewLayer previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill previewLayer.frame = self.camView.layer.bounds self.camView.layer.addSublayer(previewLayer) session.startRunning()


Esto funcionó para mí en Swift 4.2

Simplemente configure el marco de la instancia de AVCaptureVideoPreviewLayer en el marco de la vista principal, como se muestra a continuación en la función viewDidLayoutSubviews ():

override func viewDidLayoutSubviews(){ super.viewDidLayoutSubviews() avCaptureVideoPreviewLayerInstance.frame = self.parentView.bounds }


Para establecer priviewLayer restricciones de priviewLayer como código de abajo para que ocupe toda la pantalla.

Leading Space = 0 from mainView Top Space = 0 from mainView Bottom Space = 0 from mainView Trailing Space = 0 from mainView

Espero que esto te ayude.


Si desea que su capa llene la UIView correctamente, también puede definir restricciones para ella:

self.camView.layer.addSublayer(previewLayer) self.camView.layer.layoutManager = CAConstraintLayoutManager.layoutManager(); self.camView.layer.addConstraint(CAConstraint.constraintWithAttribute(CAConstraintAttribute.MinX, relativeTo: self.camView.layer, attribute: CAConstraintAttribute.MinX, scale: 1, offset: 0)); self.camView.layer.addConstraint(CAConstraint.constraintWithAttribute(CAConstraintAttribute.MaxX, relativeTo: self.camView.layer, attribute: CAConstraintAttribute.MaxX, scale: 1, offset: 0)); self.camView.layer.addConstraint(CAConstraint.constraintWithAttribute(CAConstraintAttribute.Width, relativeTo: self.camView.layer, attribute: CAConstraintAttribute.Width, scale: 1, offset: 0)); self.camView.layer.addConstraint(CAConstraint.constraintWithAttribute(CAConstraintAttribute.Height, relativeTo: self.camView.layer, attribute: CAConstraintAttribute.Height, scale: 1, offset: 0)); session.startRunning()


Si está utilizando autolayout, simplemente haga lo siguiente:

  1. Configure su vista de cámara x = 0 y con el tamaño de pantalla
  2. Aplicar la restricción inicial y final a superView

Espero que esto te ayudará.