iphone - sesión - wunderlist webapp
AVCaptureVideoPreviewLayer (6)
AVCaptureVideoPreviewLayer *avLayer =
[AVCaptureVideoPreviewLayer layerWithSession:session];
avLayer.frame = self.view.frame;
[self.view.layer addSublayer:avLayer];
Uso AVCaptureVideoPreviewLayer para mostrar video en la vista. Pero la vista del video no llenó la pantalla completa del iPhone4 (dos barras grises en el lado derecho e izquierdo)
Quiero que el video se llene a pantalla completa. ¿Cómo puedo lidiar con eso? ¡Muchas gracias!
La respuesta aceptada por Swift 4:
let bounds = view.layer.bounds
self.cameraLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
self.cameraLayer.bounds = bounds
self.cameraLayer.position = CGPoint(x:bounds.midX, y:bounds.midY)
self.cameraView?.layer.addSublayer(self.cameraLayer)
La respuesta de @ fitzwald le dará el resultado deseado, pero hay una manera más fácil. Lo que sucede es que el preajuste de sesión se establece de forma predeterminada en Video - Alto (que no coincide con la relación de aspecto de la pantalla). Se puede lograr una vista previa de pantalla completa (como en Camera.app) utilizando el ajuste preestablecido de foto. Simplemente establecer
session.sessionPreset = AVCaptureSessionPresetPhoto;
antes de comenzar su sesión Aquí está la documentación de Apple si desea obtener más información.
Por el bien de Google, esta es la respuesta aceptada pero usando Swift que es ligeramente diferente:
var bounds:CGRect = self.view.layer.bounds
previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer?.bounds = bounds
previewLayer?.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))
Tal vez esto lo resuelve?
CGRect bounds=view.layer.bounds;
avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
avLayer.bounds=bounds;
avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
Una posible causa de confusión es que AVCaptureVideoPreviewLayer
es una capa de CoreAnimation y en todas las respuestas anteriores se está posicionando estáticamente (por ejemplo, sin restricciones) relativa a una vista. Si usa restricciones para diseñar la vista, estas no cambian automáticamente el tamaño de la capa de vista previa.
Esto significa que no puede configurar la capa de vista previa en viewDidLoad
ya que el diseño aún no se ha realizado y la capa de vista previa tendrá el mismo tamaño que en el Generador de interfaces.
En su lugar, anule viewDidLayoutSubviews
en su ViewController
y coloque allí la capa de vista previa.
- (void)viewDidLayoutSubviews
{
CGRect bounds=view.layer.bounds;
avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
avLayer.bounds=bounds;
avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
}
Utilizo el siguiente código para lograr esto
previewLayer.frame = CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height);
previewLayer.orientation = [[UIDevice currentDevice] orientation];
previewLayer.contentsGravity = kCAGravityResizeAspectFill;