2013-10-25 3 views
2

Я использую UIImagePickerController в приложении Unity. Он иногда зависает, когда пользователь нажимает «done». Это происходит чаще всего на 3GS - примерно каждый третий раз - но у меня также была случайная заморозка на iPhone 5. Эта ошибка появляется в iOS с 4.3 до 7.0. Я не смог определить, какие факторы коррелируют с замораживанием. Я не получаю предупреждение о памяти, когда получаю это замораживание.UIImagePickerController иногда замерзает

В журнале нет ошибок, нет crashlog. Приложение продолжает работать позади UIImagePickerController как обычно. На консоли есть много сообщений, вроде «deny file-write-data/private/var/mobile/Media/PhotoData», но все они могут появляться как при замораживании, так и при работе хорошо.

Вот как я показываю сборщика:

- (void)showPicker:(UIImagePickerControllerSourceType)type 
{ 
    imgPicker = [[[CustomPhotoPicker alloc] init] autorelease]; 
    imgPicker.delegate = self; 
    imgPicker.sourceType = type; 
    imgPicker.allowsEditing = _pickerAllowsEditing; 

    // wrap and show the modal 
    [self showViewControllerModallyInWrapper:imgPicker]; 

} 

И here're методов делегата:

- (void)imagePickerController:(UIImagePickerController*)imgPicker didFinishPickingMediaWithInfo:(NSDictionary*)info 
{ 
    NSLog(@"imagePickerController didFinishPickingMediaWithInfo"); 

    // If the freeze is present, this method isn't called 
} 

- (void)imagePickerController:(UIImagePickerController *)imgPicker 
     didFinishPickingImage:(UIImage *)image 
        editingInfo:(NSDictionary *)editingInfo 
{ 
    NSLog(@"imagePickerController didFinishPickingImage"); 

    // Tried to use deprecated callback. If the freeze is present, this method isn't called either. 
} 

я бы решить, что это ошибка внутри UIImagePickerController, но ни один из разработчиков IOS, что не используйте Unity, когда-либо сталкивающееся с этой проблемой, и я бы предположил, что такая ошибка уже будет исправлена, если она присутствует в 4.3.

ответ

1

Thre're являются обходной путь: и можно отключить CFRunLoopRunInMode в UnityAppController.mm, как это:

- (void)repaintDisplayLink 
{ 
    [_displayLink setPaused: YES]; 
    { 
     static const CFStringRef kTrackingRunLoopMode = CFStringRef(UITrackingRunLoopMode); 
     if (![EtceteraManager picking]) 
     { 
      while (CFRunLoopRunInMode(kTrackingRunLoopMode, kInputProcessingTime, TRUE) == kCFRunLoopRunHandledSource) 
       ; 
     } 
    } 
} 
Смежные вопросы