IOS 7 UIImagePicker Предварительный просмотр черный экран
Когда я пытаюсь загрузить камеру из своего кода, предварительный просмотр камеры черный. Если я жду 10-20 секунд, это покажет реальный просмотр камеры. Я нашел несколько вопросов, и некоторые из них предполагают, что причиной этого является запуск другого кода в фоновом режиме. Однако у меня нет кода, работающего в фоновом режиме.
Как это исправить?
Это мой код, где я запускаю камеру
UIImagePickerController *photoPicker = [[UIImagePickerController alloc] init];
photoPicker.delegate = self;
photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:photoPicker animated:YES completion:NULL];
Ответы
Ответ 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;
}