1

我正在制作一个仅支持横向的 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为.PortraitLandscape

我如何尝试解决它:

在阅读了 iOS6 发行说明和之前发布的几个问题之后;我发现导致崩溃的方法是在 Application Delegate 的

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

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

但是,我希望我的应用程序Landscape只支持!Boolean所以我的第一个解决方案是在 App Delegate中添加一个标志并将其设置为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 安装来在设备上进行测试,以便将来检测到类似的问题。

太好了,但我的问题仍然存在

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

4

1 回答 1

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

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

  3. 子类根视图控制器

添加以下方法:

- (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;
    }
}

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

于 2013-01-15T16:50:57.487 回答