仅在iOS 6上使用iPad中的UIImagePicker和Landscape

时间:2013-01-15 13:14:59

标签: ipad ios6 orientation uiimagepickercontroller landscape

我正在制作一个仅支持横向方向的iPad应用程序,在该应用程序中,我使用以下代码调用照片库

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType =
UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.mediaTypes = [NSArray arrayWithObjects: (NSString *) kUTTypeImage, nil];

self.iPadPopoverController = [[UIPopoverController alloc] initWithContentViewController:imagePicker];
[self.iPadPopoverController setDelegate:self];
[self.iPadPopoverController presentPopoverFromRect:CGRectMake(490, 638, 44, 44) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

但是,这会导致崩溃,但会出现以下异常:

Uncaught exception: Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES

崩溃的原因:

经过研究,我发现崩溃的原因是UIImagePickerController始终以Portrait模式显示,即使界面方向为Landscape

我是如何解决的:

看完之后 iOS6 release notes以及之前发布的几个问题;我发现崩溃发生的方法是在Application Delegate的

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window

显而易见的解决方案是让它返回UIInterfaceOrientationMaskLandscape|UIInterfaceOrientationMaskPortrait

但是,我希望我的应用仅支持Landscape!所以我的第一个解决方案是向应用代表添加Boolean标记,并在我调用YES之前将其设置为UIImagePickerController,并在我解除后将其设置回NO

它有效,但我对它不满意,感觉就像一个混乱的解决方案。所以我改为调用它的方法,如果它是初始化UIImagePickerController的函数,那么该方法将返回UIInterfaceOrientationMaskPortrait

-(BOOL) iPadPopoverCallerFoundInStackSymbols{
    NSArray *stackSymbols = [NSThread callStackSymbols];

    for (NSString *sourceString in stackSymbols) {
       if ([sourceString rangeOfString:@"[UIViewController(PhotoImport) importPhotoFromAlbum]"].location == NSNotFound) {
           continue;
       }else{
           return YES;
       }
   }
   return NO;
}

该解决方案适用于模拟器和设备。

这是奇怪的部分

将我的应用程序提交到商店后,我的所有用户都会报告应用程序在访问照片库时崩溃。我查看了崩溃报告,发现崩溃是由于上面提到的异常而发生的。我无法理解为什么会这样。

所以我向苹果提交了关于此问题的TSI(技术支持事件)。他们回答说,应用程序存档后堆栈符号不是人类可读的,这就是我的检查总是会失败的原因。

他们还建议在设备上进行测试,首先将项目归档到.ipa文件并通过iTunes安装,以便将来检测此类问题。

这很好,但我的问题仍然存在

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

  1. 在info.plist中声明所有方向都是支持的。

  2. 您不再需要方法application:supportedInterfaceOrientationsForWindow:,因此可以将其删除。

  3. 子类根视图控制器

  4. 添加以下方法:

    - (BOOL)shouldAutorotate {
        return YES;
    }
    
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
        return UIInterfaceOrientationIsLandscape(interfaceOrientation);
    }
    
    - (NSUInteger)supportedInterfaceOrientations {
        return UIInterfaceOrientationMaskLandscape;
    }
    
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
        if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
            return self.interfaceOrientation;
        } else {
            return UIInterfaceOrientationLandscapeRight;
        }
    }
    

    如果您提供模态视图控制器并且不希望它们被旋转,那么您还需要将此代码添加到它们的根控制器中。