gpt4 book ai didi

ios - 旋转时自动调整 AVCaptureVideoPreviewLayer 大小的问题

转载 作者:可可西里 更新时间:2023-11-01 05:10:03 27 4
gpt4 key购买 nike

我编写了一个静态框架,其中有一个名为 ViewfinderViewController 的类,它使用 AVCaptureSession 设置相机。这个 ViewController 还添加了一个 AVCaptureVideoPreviewLayer 作为它自己 View 层的子层:

    // code in ViewfinderViewController.m
previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:captureSession];
previewLayer.frame = self.view.bounds;
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.view.layer addSublayer:previewLayer];

ViewfinderViewController 还进行一些视频处理,并为框架的用户提供注册一些委托(delegate)方法的机会,以防在处理的帧之一中发现或找不到感兴趣的内容。

在我的实际应用程序的 viewDidLoad 方法中,我创建了一个 ViewfinderViewController 实例,设置它的框架并将它的 View 添加为 subview :

    // code in the app's view controller viewDidLoad method
ViewfinderViewController *vfVC = [[ViewfinderViewController alloc] init];
vfVC.view.frame = self.view.bounds;
[self.view addSubview:vfVC.view];

只要我不考虑旋转(到目前为止我一直这样做),这就可以正常工作。我的主要问题是,ViewfinderViewController.view 会调整其框架的大小,但 AVCaptureVideoPreviewLayer 不会。我有点疑惑:previewLayer 不应该自动调整大小,因为它的 superLayer 对应的 View 调整大小正确吗?

有什么想法吗?我很乐意提供更多信息,但为了缩短问题的长度,我暂时不会再谈了。谢谢。

最佳答案

最后,我发现以下内容最适合我的应用。在我的应用程序中,我现在将 ViewFinderViewController 添加为 subview Controller :

- (void)viewWillAppear:(BOOL)animated;
{
if ([self.childViewControllers containsObject:self.viewfinderViewController] == NO) {
[self addChildViewController:self.viewfinderViewController];
self.viewfinderViewController.view.frame = self.view.bounds;
[self.view addSubview:self.viewfinderViewController.view];
[self.viewfinderViewController didMoveToParentViewController:self];
}
}

这样,将自动调用 willAnimateRotationToInterfaceOrientation: 方法,这是我之前从添加取景器 View 作为 subview 的 View Controller 转发的。

此外,我在 ViewfinderViewController 的这个方法中更新了 previewLayer 的大小:

- (void)viewWillLayoutSubviews;
{
self.previewLayer.frame = self.view.bounds;
}

我通过实现这两种方法来处理 previewLayer 的旋转:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[CATransaction begin];
[CATransaction setAnimationDuration:duration];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[self updatePreviewLayerForOrientation:toInterfaceOrientation];
[CATransaction commit];
}

- (void)updatePreviewLayerForOrientation:(UIInterfaceOrientation)interfaceOrientation;
{
// correct position of previewLayer
CGSize newSize = self.view.bounds.size;
self.previewLayer.position = CGPointMake(0.5 * newSize.width, 0.5 * newSize.height);

// rotate the previewLayer, in order to have camera picture right
switch (interfaceOrientation) {
case UIInterfaceOrientationPortrait:
[self.previewLayer setAffineTransform:CGAffineTransformMakeRotation(0)];
break;

case UIInterfaceOrientationLandscapeLeft:
[self.previewLayer setAffineTransform:CGAffineTransformMakeRotation(M_PI/2)];
break;

case UIInterfaceOrientationLandscapeRight:
[self.previewLayer setAffineTransform:CGAffineTransformMakeRotation(-M_PI/2)];
break;

case UIDeviceOrientationPortraitUpsideDown:
[self.previewLayer setAffineTransform:CGAffineTransformMakeRotation(M_PI)];
break;

default:
break;
}
}

我希望这对所有将 AVCaptureVideoPreviewLayer 添加为子层并且在界面旋转时遇到调整大小和方向问题的人有所帮助。

关于ios - 旋转时自动调整 AVCaptureVideoPreviewLayer 大小的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12641330/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com