Подтвердить что ты не робот

IOS 7 UIImagePicker Предварительный просмотр черный экран

Когда я пытаюсь загрузить камеру из своего кода, предварительный просмотр камеры черный. Если я жду 10-20 секунд, это покажет реальный просмотр камеры. Я нашел несколько вопросов, и некоторые из них предполагают, что причиной этого является запуск другого кода в фоновом режиме. Однако у меня нет кода, работающего в фоновом режиме. Как это исправить?

Это мой код, где я запускаю камеру

UIImagePickerController *photoPicker = [[UIImagePickerController alloc] init];

photoPicker.delegate = self;
photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:photoPicker animated:YES completion:NULL];
4b9b3361

Ответ 1

Около 5 месяцев назад моя команда обнаружила утечку памяти с помощью UIImageViewController в iOS7. Каждое инстанцирование замедляло приложение экспоненциально (то есть, первый alloc-init имел задержку в 1 секунду, второй - 2-секундную задержку, третий - задержкой 5 секунд). В конце концов, у нас было 30-60 задержек (похоже на то, что вы испытываете).

Мы решили проблему путем подклассификации UIImagePickerController и создания ее Singleton. Таким образом, он был только однажды инициализирован. Теперь наша задержка минимальна, и мы избегаем утечки. Если подклассификация не является опцией, попробуйте свойство класса в вашем диспетчере viewController и просто лените загрузите его так.

-(UIImagePickerController *)imagePicker{
    if(!_imagePicker){
        _imagePicker = [[UIImagePickerController alloc]init];
        _imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    }
    return _imagePicker;
}

Затем вы можете просто называть его позже:

[self presentViewController:self.imagePicker animated:YES completion:nil];

Ответ 2

Если бы это было сами - это случается, если что-то работает в главном потоке отправки - вы произвольно изменяете размеры изображений?

Он помещает предварительный просмотр в основной поток, и если что-то его использует, вы получаете черный экран. Это ошибка и обходной путь - либо взять на себя основной поток, либо отключить сборщик фотографий, пока очередь не станет бесплатной.

Ответ 3

Это должно работать для вас:

    - (void)cameraViewPickerController:(UIImagePickerController *)picker
{
    [self startCameraControllerFromViewController: picker
                                    usingDelegate: self];
}


- (BOOL) startCameraControllerFromViewController: (UIViewController*) controller
                                   usingDelegate: (id <UIImagePickerControllerDelegate,
                                                   UINavigationControllerDelegate>) delegate {

    if (([UIImagePickerController isSourceTypeAvailable:
          UIImagePickerControllerSourceTypeCamera] == NO)
        || (delegate == nil)
        || (controller == nil))
        return NO;


    UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
    cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;

    // Displays a control that allows the user to choose movie capture
    cameraUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, (NSString *) kUTTypeMovie,nil];

    // Hides the controls for moving & scaling pictures, or for
    // trimming movies. To instead show the controls, use YES.
    cameraUI.allowsEditing = NO;

    cameraUI.delegate = delegate;

    [controller presentViewController:cameraUI animated:YES completion:nil];
    return YES;
}