HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 在旋转时自动调整AVCaptureVideoPreviewLayer大小的问题大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经编写了一个静态框架,其中我有一个名为ViewfinderViewController的类,它使用AVCaptureSession设置摄像机.此ViewController还将AVCaptureVideoPreviewLayer添加为其自己视图层的子图层:

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

ViewfinderViewController还进行一些视频处理,并提供框架的用户注册一些委托方法,以防发现感兴趣或在其中一个处理过的帧中找不到.

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

// 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的视图是否正确调整大小?

有任何想法吗?我很乐意提供更多信息,但为了缩短问题,我现在不再进一步了解.谢谢.

解决方法

最后,我发现以下内容最适合我的应用.
在我的应用程序中,我现在将ViewFinderViewController添加为子视图控制器:

- (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:方法将被自动调用,我之前从视图控制器转发,它将取景器的视图添加为子视图.

此外,我在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大小的问题全部内容,希望文章能够帮你解决ios – 在旋转时自动调整AVCaptureVideoPreviewLayer大小的问题所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。