9
votes

enter image description here

When I present the ImagePickerController the statusBar text color is still black, how to make like this?

7

7 Answers

42
votes

Just three steps:

1: Add UINavigationControllerDelegate,UIImagePickerControllerDelegate to your

@interface yourController ()<>

2: imagePickerController.delegate = self;

3:

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

Swift solution by writing an extension for UIImagePickerController:

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

Then you can set the color when initializing it:

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

Alternative (inspired by folse's answer): When you initialize the UIImagePickerController normally, make this class the delegate (picker.delegate = self) and implement this function:

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
votes

In Swift and iOS 9, setStatusBarStyle is deprecated. You could subclass the controller.

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

I had the same problem having to manage the application runned under different iOS versions.

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

The, in delegate:

- (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];
}
2
votes

Using the answers above the following worked for me:

Implement UINavigationControllerDelegate, UIImagePickerControllerDelegate to your UIViewController and set

imagePickerController.delegate = self;

Add the following method:

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

I was facing a similar problem and I found the cleanest way to solve it was to override preferredStatusBarStyle in an extension of UIImagePickerController like so. This principal can be applied to third party libraries nicely.

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

isLightTheme() is simply a function to determine whether the NavigationBar in that controller is a light or dark colour.

0
votes

This is the quickest solution I could think of. Create the following category:

@implementation UIImagePickerController (LightStatusBar)

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

@end