AVCaptureVideoPreviewLayer не заполняет весь экран iPhone 4S

AVCaptureVideoPreviewLayer *avLayer = 
                [AVCaptureVideoPreviewLayer layerWithSession:session];
avLayer.frame = self.view.frame;
[self.view.layer addSublayer:avLayer];

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

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

enter image description here

Ответ 1

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

CGRect bounds=view.layer.bounds;
avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
avLayer.bounds=bounds;
avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));

Ответ 2

Одна потенциальная причина путаницы заключается в том, что AVCaptureVideoPreviewLayer является уровнем CoreAnimation, и во всех вышеперечисленных ответах статически ставится (например, без ограничений) относительно представления. Если вы используете ограничения для компоновки представления, они не будут автоматически изменять размер слоя предварительного просмотра.

Это означает, что вы не можете настроить уровень предварительного просмотра в viewDidLoad, поскольку макет еще не состоялся, и уровень предварительного просмотра будет иметь размер, как это было в Interface Builder.

Вместо этого переопределите viewDidLayoutSubviews на ViewController и расположите там слой предварительного просмотра.

- (void)viewDidLayoutSubviews
{
    CGRect bounds=view.layer.bounds;
    avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;  
    avLayer.bounds=bounds;
    avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
}

Ответ 3

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

session.sessionPreset = AVCaptureSessionPresetPhoto;

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

Ответ 4

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

var bounds:CGRect = self.view.layer.bounds
previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer?.bounds = bounds
previewLayer?.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))

Ответ 5

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

Свифт 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)

Ответ 6

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

previewLayer.frame = CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height);
previewLayer.orientation = [[UIDevice currentDevice] orientation];
previewLayer.contentsGravity = kCAGravityResizeAspectFill;

Ответ 7

Swift 5

Я решаю проблему, используя следующий код:

    let bounds = view.layer.bounds
    let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    view.layer.addSublayer(previewLayer)
    previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
    previewLayer.bounds = bounds
    previewLayer.position = CGPoint(x:bounds.midX, y:bounds.midY)