iOS SDK - Как вернуть строку состояния при использовании UIImagePickerController?

Как только я добавляю к моему представлению вложенное представление UIImagePickerController, строка состояния исчезает, и я не могу получить ее обратно. Есть ли способ сохранить статусную строку видимой?

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


[self.view addSubview:imagePicker.view];

[imagePicker viewWillAppear:YES];
[imagePicker viewDidAppear:YES];

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];

6 ответов

Решение

Я должен был сделать то же самое в приложении камеры. По-видимому, в дополнение к настройке строки состояния, чтобы она не была скрыта, вы также должны сбросить ее стиль после того, как вид с камеры заставит ее исчезнуть. Попробуй это:

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];

Решение принятого ответа тем временем устарело.

использование

[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

вместо

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];

Допустимые значения параметра анимации: UIStatusBarAnimationNone, UIStatusBarAnimationFade, UIStatusBarAnimationSlide, Подробности можно найти в документации.

Прочитав это и обнаружив, что ни один из ответов не сработал, мне удалось заставить его работать, выполнив следующие действия:

• Установка делегата для UIImagePickerController
• В этом делегате скрыть строку состояния в делегате navigationController:didShowViewController:animated: функция.

НАПРИМЕР:

-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [[UIApplication sharedApplication] setStatusBarHidden:NO];
}

Добавьте свой UIImagePicker в корневое представление (например, Navigation Controller или TabbarController)

[self.tabBarController presentModalViewController:imagePickerController animated:YES];

После этого вы можете использовать

- (void)imagePickerController:(UIImagePickerController *)picker 
            didFinishPickingImage:(UIImage *)image
                      editingInfo:(NSDictionary *)editingInfo
{
      // do your stuff
     [picker dismissModalViewControllerAnimated:YES];
}

закрыть ваш ImagePicker.

Ни одно из решений не работало на iOS 5.1.1 Решение Тима работало на iOS 4.2.1 Единственный способ, которым я смог решить проблему на iOS 5.1.1, был такой

-(void)viewDidAppear:(BOOL)animated
{
    double delayInSeconds = 0.01;
    dispatch_time_t popTime = 
            dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [[UIApplicationsharedApplication] setStatusBarHidden:NO];
});

что очень глупо и неправильно.

Я потратил полдня на поиски решения, а затем решил просто использовать подход AVFoundation, и мне потребовался час, чтобы реализовать тот же базовый захват фотографий, который мне был необходим, используя AVCaptureSession и AVCaptureStillImageOutput. И это тоже работает лучше - AVCaptureSession запускается быстрее, чем UIImagePickerController, а AVCaptureVideoPreviewLayer имеет гораздо лучшую частоту кадров на современных устройствах по сравнению с предварительным просмотром камеры UIImagePicker.

Ну, я знаю, что вы не должны этого делать, но если вы создаете подкласс UIImagePickerController, вы можете поместить это в свой пользовательский класс:

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    [[UIApplication sharedApplication] setStatusBarHidden:NO];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
}
Другие вопросы по тегам