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];

Ответ 1

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

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

Ответ 2

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

Используйте

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

вместо

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

Допустимыми значениями для параметра анимации являются UIStatusBarAnimationNone, UIStatusBarAnimationFade, UIStatusBarAnimationSlide. Подробности находятся в documentation.

Ответ 3

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

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

например:

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

Ответ 4

Добавьте ваш UIImagePicker в корневой режим (т.е. контроллер навигации или TabbarController)

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

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

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

чтобы закрыть ImagePicker.

Ответ 5

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

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    [[UIApplication sharedApplication] setStatusBarHidden:NO];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
}

Ответ 6

Ни одно из решений, работающих в iOS 5.1.1 Решение Tim работало на 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.