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:
- Configure su vista de cámara x = 0 y con el tamaño de pantalla
- Aplicar la restricción inicial y final a superView
Espero que esto te ayudará.