AVCaptureVideoPreviewLayer
AVCaptureVideoPreviewLayer *avLayer =
[AVCaptureVideoPreviewLayer layerWithSession:session];
avLayer.frame = self.view.frame;
[self.view.layer addSublayer:avLayer];
Я использую AVCaptureVideoPreviewLayer для отображения видео на вид. Но вид видео не заполнял весь экран iPhone4.(две серые полосы справа и слева)
Я хочу, чтобы видео заполняет весь экран. Как я могу с этим справиться? Большое спасибо!
6 ответов:
может быть, это решает он?
CGRect bounds=view.layer.bounds; avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; avLayer.bounds=bounds; avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
одной из потенциальных причин путаницы является то, что
AVCaptureVideoPreviewLayer
является слоем CoreAnimation и во всех ответах выше позиционируется статически (например, без ограничений) относительно вида. Если вы используете ограничения для компоновки представления, они не изменяют автоматически размер слоя предварительного просмотра.это означает, что вы не можете настроить слой предварительного просмотра в
viewDidLoad
поскольку макет еще не состоялся, и слой предварительного просмотра будет иметь размер, как это было в интерфейсе Строитель.вместо этого, переопределить
viewDidLayoutSubviews
наViewController
и расположите слой предпросмотра.- (void)viewDidLayoutSubviews { CGRect bounds=view.layer.bounds; avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; avLayer.bounds=bounds; avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)); }
ответ@fitzwald даст вам желаемый результат, но есть более простой способ. Что происходит, так это то, что предустановка сеанса по умолчанию имеет значение Video - High (что не соответствует соотношению сторон экрана). Полноэкранный просмотр (например, в камере.приложение) может быть достигнуто с помощью предустановленной фотографии. Просто установите
session.sessionPreset = AVCaptureSessionPresetPhoto;
перед началом сессии. Вот это Документация Apple если вы хотите узнать больше.
ради Google, это принятый ответ, но с помощью Swift, который немного отличается:
var bounds:CGRect = self.view.layer.bounds previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill previewLayer?.bounds = bounds previewLayer?.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))
принятый ответ
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)