AVCaptureVideoPreviewLayer не заполняет весь экран iPhone 4S - PullRequest
62 голосов
/ 25 февраля 2011
AVCaptureVideoPreviewLayer *avLayer = 
                [AVCaptureVideoPreviewLayer layerWithSession:session];
avLayer.frame = self.view.frame;
[self.view.layer addSublayer:avLayer];

Я использую AVCaptureVideoPreviewLayer для отображения видео на виде. Но просмотр видео не заполнил весь экран iPhone4 (две серые полосы справа и слева)

Я хочу, чтобы видео заполняло весь экран. Как я могу справиться с этим? Большое спасибо!

enter image description here

Ответы [ 6 ]

185 голосов
/ 27 февраля 2011

Может быть, это решает это?

CGRect bounds=view.layer.bounds;
avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
avLayer.bounds=bounds;
avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
13 голосов
/ 30 января 2015

Одной из возможных причин путаницы является то, что 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));
}
11 голосов
/ 01 марта 2011

@ ответ fitzwald даст вам желаемый результат, но есть более простой способ.Что происходит, так это то, что для предустановки сеанса по умолчанию установлено значение Видео - Высокое (что не соответствует соотношению сторон экрана).Предварительный просмотр в полноэкранном режиме (как в Camera.app) можно выполнить с помощью предустановки «Фото».Просто установите

session.sessionPreset = AVCaptureSessionPresetPhoto;

перед началом сеанса.Вот документация Apple , если вы хотите узнать больше.

8 голосов
/ 19 сентября 2014

Ради Google, это принятый ответ, но использующий Swift, который немного отличается:

var bounds:CGRect = self.view.layer.bounds
previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer?.bounds = bounds
previewLayer?.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))
3 голосов
/ 14 декабря 2017

Принятый ответ

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)
1 голос
/ 17 мая 2013

Я использую следующий код для достижения этого

previewLayer.frame = CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height);
previewLayer.orientation = [[UIDevice currentDevice] orientation];
previewLayer.contentsGravity = kCAGravityResizeAspectFill;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...