Ответ 1
Может быть, это решает?
CGRect bounds=view.layer.bounds;
avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
avLayer.bounds=bounds;
avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
AVCaptureVideoPreviewLayer *avLayer =
[AVCaptureVideoPreviewLayer layerWithSession:session];
avLayer.frame = self.view.frame;
[self.view.layer addSublayer:avLayer];
Я использую AVCaptureVideoPreviewLayer для отображения видео в представлении. Но видео-просмотр не заполнил весь экран iPhone4 (две серые полосы справа и слева)
Я хочу, чтобы видео заполнялось в полноэкранном режиме. Как я могу с этим справиться? Большое вам спасибо!
Может быть, это решает?
CGRect bounds=view.layer.bounds;
avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
avLayer.bounds=bounds;
avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
Одна потенциальная причина путаницы заключается в том, что 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));
}
Ответ @fitzwald даст вам желаемый результат, но есть более простой способ. Что происходит, так это то, что в настройках сеанса по умолчанию используется Video - High (что не соответствует соотношению сторон экрана). Полноэкранный просмотр (например, в Camera.app) может быть достигнут с помощью предустановки Photo. Просто установите
session.sessionPreset = AVCaptureSessionPresetPhoto;
перед началом сеанса. Здесь Apple Documentation, если вы хотите узнать больше.
Ради этого, это принятый ответ, но с помощью Swift, который немного отличается:
var bounds:CGRect = self.view.layer.bounds
previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer?.bounds = bounds
previewLayer?.position = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))
Принятый ответ
Свифт 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)
Я использую следующий код для достижения этого
previewLayer.frame = CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height);
previewLayer.orientation = [[UIDevice currentDevice] orientation];
previewLayer.contentsGravity = kCAGravityResizeAspectFill;
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)