我正在制作一个仅支持横向的 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 发行说明和之前发布的几个问题之后;我发现导致崩溃的方法是在 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 安装来在设备上进行测试,以便将来检测到类似的问题。
太好了,但我的问题仍然存在
有谁知道如何解决这个问题?