Как сделать стиль UIImagePickerController StatusBar lightContent?

введите здесь описание изображения

Когда я представляю ImagePickerController, цвет текста в строке состояния по-прежнему черный, как это сделать?


person folse    schedule 20.01.2014    source источник


Ответы (7)


Всего три шага:

1: Добавьте UINavigationControllerDelegate,UIImagePickerControllerDelegate к вашему

@interface yourController ()<>

2: imagePickerController.delegate = self;

3:

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
person folse    schedule 20.01.2014
comment
Это работает, потому что UIImagePickerController является подклассом UINavigationController, и этот метод делегата вызывается каждый раз, когда вы представляете другой контроллер представления в стеке контроллера навигации. - person barndog; 16.08.2014
comment
setStatusBarStyle устарело в iOS 9 - person Huy Le; 18.05.2016
comment
@barndog Как я могу скрыть строку состояния, когда отображается imagePicker? Существует ошибка, из-за которой обрезанные изображения добавляют смещение по оси y к размеру строки состояния, поскольку строка не обрезается. - person AnonProgrammer; 27.04.2018

Быстрое решение, написав расширение для UIImagePickerController:

extension UIImagePickerController {
    convenience init(navigationBarStyle: UIBarStyle) {
        self.init()
        self.navigationBar.barStyle = navigationBarStyle
    }
}

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

let picker = UIImagePickerController(navigationBarStyle: .black)    // black bar -> white text

Альтернатива (вдохновленная folse answer): когда вы обычно инициализируете UIImagePickerController, сделайте этот класс делегатом (picker.delegate = self) и реализуйте это функция:

func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
    if navigationController is UIImagePickerController {        // check just to be safe
        navigationController.navigationBar.barStyle = .black    // black bar -> white text
    }
}
person Alex Wally    schedule 13.04.2017
comment
Первое решение (пользовательский инициализатор) у меня не работает. - person Cesare; 29.01.2018
comment
Вопрос касался цвета строки состояния, а не цвета панели навигации. - person Igor Kulagin; 04.01.2021

В Swift и iOS 9 setStatusBarStyle устарело. Вы можете создать подкласс контроллера.

private final class LightStatusImagePickerController: UIImagePickerController {
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .lightContent
    }
}
person Huy Le    schedule 18.05.2016
comment
Отличное предложение, и я думаю, что это правильный путь для продвижения вперед! Но у меня почему-то не сработало. Вызовы вызываются, я также пробовал PrefersStatusBarHidden и даже вызывал self.setNeedsStatusBarAppearanceUpdate в viewDidLoad. Строка состояния по-прежнему отображается как darkContent. - person shashwat; 07.06.2016
comment
Согласно документации Apple UIImagePickerController, вы не должны подклассифицировать контроллер. Класс UIImagePickerController поддерживает только портретный режим. Этот класс предназначен для использования как есть и не поддерживает создание подклассов. Иерархия представлений для этого класса является закрытой и не может быть изменена, за одним исключением. Вы можете назначить пользовательское представление для свойства cameraOverlayView и использовать это представление для предоставления дополнительной информации или управления взаимодействием между интерфейсом камеры и вашим кодом. - person matrejek; 28.10.2017
comment
В iOS 13 не работает. Метод из подкласса не вызывается. - person Igor Kulagin; 05.02.2020

У меня была такая же проблема с управлением приложением, работающим под разными версиями iOS.

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

if(IS_IOS8_AND_UP) {
    imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;
} else {
    imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
}

imagePickerController.delegate = self;
[self presentViewController:imagePickerController animated:YES completion:nil];

В делегате:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    /* Cancel button color  */
    _imagePicker.navigationBar.tintColor = <custom_color>
    /* Status bar color */
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
person Luca Davanzo    schedule 10.12.2014

Используя ответы выше, у меня сработало следующее:

Внедрите UINavigationControllerDelegate, UIImagePickerControllerDelegate в свой UIViewController и установите

imagePickerController.delegate = self;

Добавьте следующий метод:

-(void) navigationController: (UINavigationController *) navigationController willShowViewController: (UIViewController *) viewController animated: (BOOL) animated { 
    navigationController.navigationBar.barStyle = UIBarStyleBlack;
}
person Theunodebruin    schedule 04.07.2017

Я столкнулся с аналогичной проблемой, и я нашел, что самый простой способ решить ее — переопределить preferredStatusBarStyle в расширении UIImagePickerController вот так. Этот принцип может быть хорошо применен к сторонним библиотекам.

extension UIImagePickerController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        if isLightTheme() {
            return .default // black text
        }
        return .lightContent // white text
    }
}

isLightTheme() — это просто функция для определения того, имеет ли NavigationBar в этом контроллере светлый или темный цвет.

person revilo    schedule 11.01.2019

Это самое быстрое решение, которое я мог придумать. Создайте следующую категорию:

@implementation UIImagePickerController (LightStatusBar)

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

@end
person Bryan    schedule 17.11.2017