在 iPhone 的 iOS 7 中打开相机时横向模式下的方向问题

Posted

技术标签:

【中文标题】在 iPhone 的 iOS 7 中打开相机时横向模式下的方向问题【英文标题】:Orientation issue in Landscape mode while opening camera in iOS 7 in iPhone 【发布时间】:2014-05-21 04:40:11 【问题描述】:

我有一个仅处于横向模式的应用程序。在我的应用程序中,我从我的一个视图中打开相机。它在我的 iPad 上运行良好,但在 iPhone 上它崩溃了。它在 ios 6 中运行良好,但应用在 iOS 7 和 iPhone 上崩溃。

下面是我的代码。

if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])


    ipc=[[UIImagePickerController alloc] init ];
    ipc.delegate=self;
    ipc.sourceType=UIImagePickerControllerSourceTypeCamera;
    [self presentViewController:ipc animated:YES completion:nil];
 
else 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Desc" message:@"Camera capture is not supported in this device" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];
    [alert release];

如何解决这个问题?

当我选择从相机捕捉时它崩溃了。它不会从上面的代码中崩溃,但之后它会崩溃并出现以下错误。

我收到此错误:

由于未捕获的异常'UIApplicationInvalidInterfaceOrientation'而终止应用程序,原因:'支持的方向与应用程序没有共同的方向,并且 shouldAutorotate 正在返回 YES

我的应用程序崩溃了。

我在这个视图上的定位代码。

-(BOOL)shouldAutorotate

    return YES;


-(NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight ;

【问题讨论】:

【参考方案1】:

我以前也遇到过同样的问题。我按照步骤操作。请试试这个,让我知道你是否面临同样的问题。 复选标记

第 1 步: 签入 appdelegate.m

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
     return UIInterfaceOrientationMaskAll;

第 2 步:在您的视图控制器中

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
if (interfaceOrientation==UIInterfaceOrientationLandscapeLeft || interfaceOrientation==UIInterfaceOrientationLandscapeRight)
    return YES;
    return NO;

第 3 步:您的视图控制器

-(IBAction)TakePhoto:(id)sender

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    
       UIImagePickerController*    imagePicker = [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        imagePicker.allowsEditing = YES;
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        imagePicker.mediaTypes = [NSArray arrayWithObjects:(NSString *) kUTTypeImage, nil];
        [self.view.window.rootViewController presentViewController:imagePicker animated:YES completion:nil];//add to view as per requirement
    
    else
    
        UIAlertView *noCam = [[UIAlertView alloc] initWithTitle:@"Notification" message:@"There is No Camera Fecility" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [noCam show];
    

【讨论】:

我用上面提到的链接解决了我的问题。你的代码有问题吗?那我可以帮你。【参考方案2】:

崩溃是在启动UIImagePickerController 时发生还是在使用相机拍摄图像后发生?我在运行 iOS7 的 iPod 上试用了您的代码,它运行良好。问题可能出在其他地方。我已经看到UIImagePickerController 由于内存使用而发生崩溃,因此您可以检查一下。同样,当我们使用它时,presentModalViewController:animated: 自 iOS6.0 以来已被弃用。您需要改用presentViewController:animated:completion:。还看到你的UIAlertView 的发布声明,看起来你没有使用ARC 所以内存使用肯定是我会研究的。希望这会有所帮助。编辑:来自UIImagePickerController 文档Important: The UIImagePickerController class supports portrait mode only. This class is intended to be used as-is and does not support subclassing. The view hierarchy for this class is private and must not be modified, with one exception. You can assign a custom view to the cameraOverlayView property and use that view to present additional information or manage the interactions between the camera interface and your code.

【讨论】:

我已经编辑了我的答案。选择器仅支持肖像,而您的应用不支持。 您可以做的是创建一个 UIView 并将 UIImagePickerView 作为子视图添加到它。有几篇文章展示了如何做到这一点,或者您可以使用此处描述的 AVFoundation 框架:***.com/a/11232352/1113598 是的,没错,但问题是我给了我的应用程序所有支持的方向,并将方向锁定为仅用于相机视图的纵向,并且它工作正常,但对于我的第一个视图,它仅以纵向显示模式。所有视图都被锁定,但只有我的第一个 VC 以纵向模式显示。 ***.com/questions/20468335/… 看看这个问题,你能告诉我我需要从我的项目中创建哪个类别吗? 您需要执行第 1 步。在第 2 步中,您需要检查支持的方向并返回它们。第 3 步将按原样添加,因为您需要选择器以横向方式启动。【参考方案3】:

试试这个代码,它适用于我的旧应用。

-(BOOL)shouldAutorotate 
    return YES;

- (NSUInteger)supportedInterfaceOrientations 
    return UIInterfaceOrientationMaskLandscape;

您可能想检查一下:GameCenter authentication in landscape-only app throws UIApplicationInvalidInterfaceOrientation

【讨论】:

【参考方案4】:

我从链接iOS7 iPad Landscape only app, using UIImagePickerController找到了我的解决方案。

它对我很有用。

希望它也对其他人有所帮助。

感谢您的帮助。

【讨论】:

【参考方案5】:

我继承了 UIImagePickerController,并覆盖了两个方法来支持景观(或者你可以创建一个类别):

- (NSUInteger)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskLandscape;


- (BOOL)shouldAutorotate

    return YES;

并在支持的界面方向(iPad)中添加纵向(底部主页按钮)、横向(左侧主页按钮)、横向(右侧主页按钮)。

这里必须添加Portrait(底部home键)的值,因为UIImagePickerController只支持竖屏模式,所以我们需要添加竖屏模式,否则会抛出异常。

【讨论】:

以上是关于在 iPhone 的 iOS 7 中打开相机时横向模式下的方向问题的主要内容,如果未能解决你的问题,请参考以下文章

从纵向活动中以横向打开相机时上下文为空

iOS 7 从 Mobile Safari 访问 iPhone 相机?

iOS:使用缩放模拟 iPhone 相机胶卷

CSS 位置问题:在 iOS 9 iPhone 6+ 中以横向模式修复

向后兼容 iOS 7 的 iPhone 纵向横向自适应 UI 示例

在 iphone 7 xamarin ios 中缩小图像?