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

enter image description here

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

Ответ 1

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

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

@interface yourController ()<>

2: imagePickerController.delegate = self;

3:

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

Ответ 2

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

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

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

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

Альтернатива (вдохновлена ​​ответным ответом): Когда вы обычно инициализируете 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
    }
}

Ответ 3

У меня была такая же проблема, связанная с управлением приложением, запущенным в разных версиях 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];
}

Ответ 4

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

private final class LightStatusImagePickerController: UIImagePickerController {
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .lightContent
    }
}

Ответ 5

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

Реализовать UINavigationControllerDelegate, UIImagePickerControllerDelegate на ваш UIViewController и установите

imagePickerController.delegate = self;

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

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

Ответ 6

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

@implementation UIImagePickerController (LightStatusBar)

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

@end

Ответ 7

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

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

isLightTheme() - это просто функция, позволяющая определить, является ли isLightTheme() навигации в этом контроллере светлым или темным цветом.