Ios 旋转时自动调整AVCaptureVideoPreviewLayer大小的问题
我已经编写了一个静态框架,其中有一个名为ViewfinderViewController的类,该类使用AVCaptureSession设置相机。此ViewController还将AVCaptureVideoPreviewLayer作为子层添加到其自己的视图层:Ios 旋转时自动调整AVCaptureVideoPreviewLayer大小的问题,ios,ios5,Ios,Ios5,我已经编写了一个静态框架,其中有一个名为ViewfinderViewController的类,该类使用AVCaptureSession设置相机。此ViewController还将AVCaptureVideoPreviewLayer作为子层添加到其自己的视图层: // code in ViewfinderViewController.m previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:captur
// 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];
}
}
- (void)viewWillLayoutSubviews;
{
self.previewLayer.frame = self.view.bounds;
}
这样,将自动调用WillAnimateRotationInterfaceOrientation:方法,我之前从视图控制器转发了该方法,该控制器将取景器的视图添加为其子视图
此外,我使用ViewfinderViewController的此方法更新previewLayer大小:
- (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];
}
}
- (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添加为子层的所有人,并且在界面旋转时在调整大小和方向方面存在问题。从视图控制器的视图中调用
setNeedsLayout
是否有帮助(无效)layoutSubviews?+1我在viewWillLayoutSubviews中缺少previewLayer的更新。。。谢谢