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