UIImagePickerController仅在iOS 7-iPad上崩溃
自从人们开始升级到iOS 7以来,我的一个实时应用程序已经导致数百次崩溃。还有谁见过这个问题吗?在我的iPad3和iOS 7上没有任何内容可以复制 链接到Crashlytics:UIImagePickerController仅在iOS 7-iPad上崩溃,ios,ipad,uiimagepickercontroller,ios7,Ios,Ipad,Uiimagepickercontroller,Ios7,自从人们开始升级到iOS 7以来,我的一个实时应用程序已经导致数百次崩溃。还有谁见过这个问题吗?在我的iPad3和iOS 7上没有任何内容可以复制 链接到Crashlytics: 致命异常CALayerInvalidGeometry CALayer位置包含NaN:[NaN NaN] 0 ... CoreFoundation uu例外预处理+130 2 CoreFoundation-[NSException initWithCoder:] 3夸脱核心CA::层::设置位置(CA::Vec2常
致命异常CALayerInvalidGeometry
CALayer位置包含NaN:[NaN NaN]
0 ... CoreFoundation uu例外预处理+130
2 CoreFoundation-[NSException initWithCoder:]
3夸脱核心CA::层::设置位置(CA::Vec2常量和,布尔)+242
4夸脱芯-[CALayer设置位置:][54
5夸脱芯-[CALayer setFrame:+594
6 UIKit-[UIView(几何)设置帧:+254
7 UIKit-[UILabel setFrame:+138
8 UIKit-[UINavigationItemView initWithNavigationItem:+384
9 UIKit-[UINavigationItem _titleView]+92
10 UIKit-[UINavigationBar_prepareforpushanimation with items:][68
11 UIKit-[UINavigationBar推式导航项目:+292
12 UIKit-[UINavigationBar_pushNavigationItem:转换:][386
13 UIKit u_71-[UINavigationController pushViewController:转换:强制立即:][u块invoke+150
14 UIKit-[UINavigationController推视图控制器:转换:强制立即:+1384
15 UIKit-[UINavigationController按钮视图控制器:动画::+294
16 UIKit-[UIImagePickerController\u设置控制器ForCurrentSourceType]+112
17 UIKit-[UIImagePickerController设置源类型:][456
18 ... libdispatch.dylib _dispatch _call _block _和_release+10
19 libdispatch.dylib_dispatch_client_callout+22
20 libdispatch.dylib_dispatch_main_queue_callback_4CF$VARIANT$mp+268
21 CoreFoundation\uuu CFRUNLOOP\u正在为\u主\u调度\u队列\uuu8提供服务
22 CoreFoundation\uuu CFRunLoopRun+1300
23 CoreFoundation CFRunLoopRunSpecific+522
24 CoreFoundation CFRunLoopRunInMode+106
25图形服务GSEventRunModal+138
26 UIKit UIApplicationMain+1136
我们共同得出结论,这是iPad iOS 7中的一个漏洞。首次尝试从UIBarButtonim在UIPopoverControl中显示UIImagePickerController时,会发生此错误。在用户授予其相册的权限后,会发生崩溃。目前的解决方案似乎是在打开UIPopoverControl之前请求对照片的许可。以下是我如何实施我的解决方案:
// Photo Library
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
{
void(^blk)() = ^() {
UIImagePickerController* picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
if (NIIsPad()) {
UIPopoverController* popover = [[UIPopoverController alloc] initWithContentViewController:picker];
[popover presentPopoverFromBarButtonItem:self.popoverAnchor permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
} else {
[self.navigationController presentModalViewController:picker animated:YES];
}
};
// Make sure we have permission, otherwise request it first
ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc] init];
ALAuthorizationStatus authStatus;
if (IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0"))
authStatus = [ALAssetsLibrary authorizationStatus];
else
authStatus = ALAuthorizationStatusAuthorized;
if (authStatus == ALAuthorizationStatusAuthorized) {
blk();
} else if (authStatus == ALAuthorizationStatusDenied || authStatus == ALAuthorizationStatusRestricted) {
[[UIAlertView alertViewWithTitle:@"Grant photos permission" message:@"Grant permission to your photos. Go to Settings App > Privacy > Photos."] show];
} else if (authStatus == ALAuthorizationStatusNotDetermined) {
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
// Catch the final iteration, ignore the rest
if (group == nil)
dispatch_async(dispatch_get_main_queue(), ^{
blk();
});
*stop = YES;
} failureBlock:^(NSError *error) {
// failure :(
dispatch_async(dispatch_get_main_queue(), ^{
[[UIAlertView alertViewWithTitle:@"Grant photos permission" message:@"Grant permission to your photos. Go to Settings App > Privacy > Photos."] show];
});
}];
}
}
别忘了将AssetsLibrary.framework添加到项目中。我也遇到了同样的问题 我在
UIPopoverController
中显示了一个UIImagePickerController
,大小由UIImagePickerController的contentSizeForViewInPopover函数定义。为了解决此问题,我将
UIPopoverController
size更改为UIImagePickerController的preferredContentSize
函数。您可以使用自定义帧并按如下方式加载popover
[popOver presentPopoverFromRect:CGRectMake(self.view.frame.size.width-50, 50, 10, 10) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
我们不能让异常在测试中发生。我们只从Crashlytics知道它,并假设它从应用程序中崩溃了。我得到了同样的结果——让我们来比较一下。我假设这是从UIImagePickerController开始的。我使用它的相机和照片库访问。我怀疑这是在照片库访问期间由于导航栏的东西而崩溃的。我将图像选取器放在UIPopoverController中,并将其呈现给用户——也许这与此有关?我只在这个场景中得到了相同的结果:我第一次在iPad上从uibarbuttonitem中拿出库版本的选取器。系统要求用户授予访问照片库的权限。用户说是的,我得到以上崩溃。我得到这个问题时,显示iOS 7上的iPad上的UIImagePickerController从一个UIBarButtonim访问照片库。有人知道如何重置照片隐私以便再次显示照片隐私消息吗?建议的解决方法是调用ALAssetLibrary调用以获取缩略图图像或其他可以工作或导致对话框显示的内容。然后在回调的块中,显示图像选择器。仅供参考,我向苹果公司提交了一个bug,id 15077496kurtzmarc,谢谢你发布这个。我很惊讶它通过了苹果的QA…我在苹果的网站上找不到那个bug报告。它标记为私有吗?我看不到bug报告中任何地方可以切换public/privatenvm-你看不到其他人的bug报告(因此需要打开雷达)。我忘了。
[popOver presentPopoverFromRect:CGRectMake(self.view.frame.size.width-50, 50, 10, 10) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];