Когда я представляю ImagePickerController, цвет текста statusBar по-прежнему остается черным, как это сделать?
Когда я представляю ImagePickerController, цвет текста statusBar по-прежнему остается черным, как это сделать?
Всего три шага:
1: добавьте UINavigationControllerDelegate
, UIImagePickerControllerDelegate
к вашему
@interface yourController ()<>
2: imagePickerController.delegate = self;
3:
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
Быстрое решение, написав расширение для 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
}
}
У меня была такая же проблема, связанная с управлением приложением, запущенным в разных версиях 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];
}
В Swift и iOS 9, setStatusBarStyle
устарел. Вы можете подклассифицировать контроллер.
private final class LightStatusImagePickerController: UIImagePickerController {
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .lightContent
}
}
Используя ответы выше, я работал у меня:
Реализовать
UINavigationControllerDelegate, UIImagePickerControllerDelegate
на ваш UIViewController
и установите
imagePickerController.delegate = self;
Добавьте следующий метод:
-(void) navigationController: (UINavigationController *) navigationController willShowViewController: (UIViewController *) viewController animated: (BOOL) animated {
navigationController.navigationBar.barStyle = UIBarStyleBlack;
}
Это самое быстрое решение, о котором я мог думать. Создайте следующую категорию:
@implementation UIImagePickerController (LightStatusBar)
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
@end
Я столкнулся с подобной проблемой и нашел, что самый простой способ ее решения - переопределить preferredStatusBarStyle
UIImagePickerController
в расширении UIImagePickerController
. Этот принцип может быть применен к сторонним библиотекам.
extension UIImagePickerController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
if isLightTheme() {
return .default // black text
}
return .lightContent // white text
}
}
isLightTheme()
- это просто функция, позволяющая определить, является ли isLightTheme()
навигации в этом контроллере светлым или темным цветом.