0

当我尝试关闭我的 UIImagePickerController 时,它会使应用程序崩溃。错误是:“由于未捕获的异常'UIApplicationInvalidInterfaceOrientation'而终止应用程序,原因:'preferredInterfaceOrientationForPresentation 必须返回支持的界面方向!'”

我在视图控制器中设置了首选界面方向。

-(NSUInteger)supportedInterfaceOrientations
{
 return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationPortrait;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}

- (BOOL) shouldAutorotate {
return YES;
}

这是我调用来调出摄像头的方法,这对于添加摄像头效果很好,但是就像我说的,当我尝试移除摄像头时会崩溃。

-(IBAction)addCamera:(id)sender
{

self.cameraController = [[UIImagePickerController alloc] init];
self.cameraController.sourceType = UIImagePickerControllerSourceTypeCamera;

self.cameraController.cameraViewTransform = CGAffineTransformScale(self.cameraController.cameraViewTransform,
                                                                   1.13f,
                                                                   1.13f);

self.cameraController.showsCameraControls = NO;
self.cameraController.navigationBarHidden = YES;

self.wantsFullScreenLayout = YES;

ar_overlayView = [[UIView alloc] initWithFrame:CGRectZero];

self.view = ar_overlayView;
[self.cameraController setCameraOverlayView:ar_overlayView];
[self presentViewController:cameraController animated:NO completion:nil];
[ar_overlayView setFrame:self.cameraController.view.bounds];
}

-(IBAction)back:(id)sender
{
[ar_overlayView removeFromSuperview];
[cameraController dismissViewControllerAnimated:NO completion:nil];
}
4

5 回答 5

1

好了,找到了解决办法,真的很简单,我只是把我的back方法改成:

    [self dismissModalViewControllerAnimated:YES];

现在我的相机消失了,当我按下后退按钮时,我可以看到我的原始视图。当我浏览了 info.plist 和支持方向的方法时,我仍然没有弄清楚是什么导致了原始问题,但这实现了我想要的。

如果有人有任何想法,我仍然对导致错误的原因感到好奇。

于 2012-12-21T04:16:56.970 回答
1

您可以尝试删除此方法:

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation

它会修复它。但有时它会导致减少 stateBar 高度。

于 2015-10-09T06:51:28.583 回答
0

如果它是相机叠加层,我认为您不需要自己添加ar_overlayView到当前视图中。

这是您的代码现在正在执行的操作:

  1. 添加ar_overlayView到当前视图
  2. 添加ar_overlayView为相机的叠加视图
  3. 显示相机视图(模态)

此时,ar_overlayView正在显示两次。当您向它removeFromSuperview发送关于关闭相机视图的消息时,它可能会感到困惑,因为它同时位于两个视图层次结构中。

跳过self.view = ar_overlayView;or[self.view addSubview:ar_overlayView];行应该可以解决问题。

此外,dismissViewControllerAnimated:completion:应该发送到presentViewController:animated:completion被调用的同一对象(self在这种情况下):

-(IBAction)addCamera:(id)sender
{
  // -- snip -- //
  ar_overlayView = [[UIView alloc] initWithFrame:self.cameraController.view.bounds];
  [self.cameraController setCameraOverlayView:ar_overlayView];
  [self presentViewController:self.cameraController animated:NO completion:nil];
}

-(IBAction)back:(id)sender
{
  [self dismissViewControllerAnimated:NO completion:nil];
}
于 2012-12-18T05:11:33.953 回答
0

您不能从其父视图中删除 UIViewController 的主视图。

而不是这个:

self.view = ar_overlayView;

尝试这个:

[self.view addSubview:ar_overlayView];

然后您将能够正确地将其从超级视图中删除。

于 2012-12-17T22:56:48.933 回答
0

您应该使用类似于下面的 didFinishPickingMedieWithInfo 方法并使用 [self dismissModalViewControllerAnimated:YES];

-(void) imagePickerController:(UIImagePickerController *) picker didFinishPickingMediaWithInfo:(NSDictionary *)info

{

if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {

    NSLog(@"Camera");


}

else {


    NSLog(@"Album");

 }

 [self dismissModalViewControllerAnimated:YES];
 }
于 2012-12-17T23:37:09.113 回答