我正在制作一个仅支持横向方向的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安装,以便将来检测此类问题。
这很好,但我的问题仍然存在
有谁知道如何解决这个问题?
答案 0 :(得分:0)
在info.plist中声明所有方向都是支持的。
您不再需要方法application:supportedInterfaceOrientationsForWindow:
,因此可以将其删除。
子类根视图控制器
添加以下方法:
- (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;
}
}
如果您提供模态视图控制器并且不希望它们被旋转,那么您还需要将此代码添加到它们的根控制器中。