AVCaptureVideoPreviewLayer *avLayer =
[AVCaptureVideoPreviewLayer layerWithSession:session];
avLayer.frame = self.view.frame;
[self.view.layer addSublayer:avLayer];
J'utilise AVCaptureVideoPreviewLayer pour afficher la vidéo sur la vue. Mais la vue de la vidéo n'a pas rempli l'écran complet de l'iPhone4 (deux barres grises à droite et à gauche)
Je veux que la vidéo se remplisse plein écran. Comment puis-je y faire face? Merci beaucoup!
Peut-être que cela le résout?
CGRect bounds=view.layer.bounds;
avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
avLayer.bounds=bounds;
avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
Une source potentielle de confusion est que le AVCaptureVideoPreviewLayer
est une couche CoreAnimation et dans toutes les réponses ci-dessus est positionné statiquement (par exemple sans contraintes) par rapport à une vue. Si vous utilisez des contraintes pour mettre en page la vue, celles-ci ne redimensionnent pas automatiquement le calque d'aperçu.
Cela signifie que vous ne pouvez pas configurer la couche d'aperçu dans viewDidLoad
car la mise en page n'a pas encore eu lieu et la couche d'aperçu dimensionnera la façon dont elle était dans Interface Builder.
À la place, remplacez viewDidLayoutSubviews
sur votre ViewController
et placez-y le calque d'aperçu.
- (void)viewDidLayoutSubviews
{
CGRect bounds=view.layer.bounds;
avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
avLayer.bounds=bounds;
avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
}
La réponse de @ fitzwald vous donnera le résultat souhaité, mais il existe un moyen plus simple. Ce qui se passe, c'est que le préréglage de session est par défaut Vidéo - Élevé (qui ne correspond pas au rapport d'aspect de l'écran). Un aperçu plein écran (comme dans Camera.app) peut être obtenu en utilisant le préréglage photo. Réglez simplement
session.sessionPreset = AVCaptureSessionPresetPhoto;
avant de commencer votre session. Voici le Documentation Apple si vous voulez en savoir plus.
Pour Google, c'est la réponse acceptée mais en utilisant Swift qui est légèrement différent:
var bounds:CGRect = self.view.layer.bounds
previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer?.bounds = bounds
previewLayer?.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))
La réponse acceptée
Swift 3:
let bounds = view.layer.bounds
self.cameraLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
self.cameraLayer.bounds = bounds
self.cameraLayer.position = CGPoint(x:bounds.midX, y:bounds.midY)
self.cameraView?.layer.addSublayer(self.cameraLayer)
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)
J'utilise le code suivant pour y parvenir
previewLayer.frame = CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height);
previewLayer.orientation = [[UIDevice currentDevice] orientation];
previewLayer.contentsGravity = kCAGravityResizeAspectFill;