2013-09-22 4 views
15

Я получаю сотни сбоев от одного из моих живых приложений с тех пор, как люди начали обновление до iOS 7. Кто-нибудь еще видел эту проблему? Ничто не воспроизводит на моем IPad 3 с прошивкой 7 ...Ошибка UIImagePickerController только на iOS 7 - iPad

Ссылки на Crashlytics: crashes.to/s/edf2e71d9a5

Fatal Exception CALayerInvalidGeometry 
CALayer position contains NaN: [nan nan] 
0 ... CoreFoundation __exceptionPreprocess + 130 
2 CoreFoundation -[NSException initWithCoder:] 
3 QuartzCore  CA::Layer::set_position(CA::Vec2<double> const&, bool) + 242 
4 QuartzCore -[CALayer setPosition:] + 54 
5 QuartzCore -[CALayer setFrame:] + 594 
6 UIKit -[UIView(Geometry) setFrame:] + 254 
7 UIKit -[UILabel setFrame:] + 138 
8 UIKit -[UINavigationItemView initWithNavigationItem:] + 384 
9 UIKit -[UINavigationItem _titleView] + 92 
10 UIKit -[UINavigationBar _prepareForPushAnimationWithItems:] + 68 
11 UIKit -[UINavigationBar pushNavigationItem:] + 292 
12 UIKit -[UINavigationBar _pushNavigationItem:transition:] + 386 
13 UIKit __71-[UINavigationController pushViewController:transition:forceImmediate:]_block_invoke + 150 
14 UIKit -[UINavigationController pushViewController:transition:forceImmediate:] + 1384 
15 UIKit -[UINavigationController pushViewController:animated:] + 294 
16 UIKit -[UIImagePickerController _setupControllersForCurrentSourceType] + 112 
17 UIKit -[UIImagePickerController setSourceType:] + 456 
18 ... libdispatch.dylib _dispatch_call_block_and_release + 10 
19 libdispatch.dylib _dispatch_client_callout + 22 
20 libdispatch.dylib _dispatch_main_queue_callback_4CF$VARIANT$mp + 268 
21 CoreFoundation __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8 
22 CoreFoundation __CFRunLoopRun + 1300 
23 CoreFoundation CFRunLoopRunSpecific + 522 
24 CoreFoundation CFRunLoopRunInMode + 106 
25 GraphicsServices GSEventRunModal + 138 
26 UIKit UIApplicationMain + 1136 
+0

, когда вы говорите «ничего не воспроизводит», что о вашем 'Fatal Exception CALayerInvalidGeometry'? после этого процедура приложения функционирует нормально? попробуйте исправить эту проблему и посмотреть, что произойдет. –

+2

Мы не можем получить исключение в нашем тестировании. Мы знаем об этом только от Crashlytics и предполагаем, что он вылетает из приложения. – jjxtra

+2

Я получаю то же самое - давайте сравним записи. Я предполагаю, что это начинается с UIImagePickerController. Я использую его как для доступа к фотокамерам, так и к фото. Я подозреваю, что это сбой во время доступа к библиотечной библиотеке из-за материала навигационной панели. Я помещал сборщик изображений в UIPopoverController и представлял его пользователю - может быть, это имеет к этому какое-то отношение? – kurtzmarc

ответ

16

Коллективно мы пришли к выводу, что это ошибка в прошивке 7 на IPad. Это происходит, когда вы пытаетесь показать UIImagePickerController в UIPopoverControl из UIBarButtonItem в первый раз. После того как пользователь предоставит разрешение на их фотоальбом, произойдет сбой. Похоже, сейчас решение состоит в том, чтобы запросить разрешение на фотографии перед открытием 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 к вашему проекту.

+0

Just FYI Я подал ошибку с Apple, id 15077496 – jjxtra

+0

И открыть радарную ссылку: http://openradar.appspot.com/radar?id=6369788687286272 – jjxtra

+0

kurtzmarc Спасибо за это сообщение. Я очень удивлен, что это проделало мимо QA Apple ... – jjxtra

0

У меня была такая же проблема.

У меня был UIImagePickerController, отображаемый внутри UIPopoverController с размером, определяемым функцией содержимого UIImagePickerControllerSizeForViewInPopover.
Чтобы исправить эту проблему, я изменил UIPopoverController размер до UIImagePickerController's preferredContentSize функция.

0

Вы можете использовать пользовательский кадр и загрузить поповер как ниже

[popOver presentPopoverFromRect:CGRectMake(self.view.frame.size.width-50, 50, 10, 10) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
Смежные вопросы