当我呈现ImagePickerController时,状态栏文本颜色仍然是黑色,如何使其变成这样?
只需要三个步骤:
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编写扩展的方式,提供了Swift解决方案:
extension UIImagePickerController {
convenience init(navigationBarStyle: UIBarStyle) {
self.init()
self.navigationBar.barStyle = navigationBarStyle
}
}
let picker = UIImagePickerController(navigationBarStyle: .black) // black bar -> white text
替代方案(受folse's 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
}
}
根据上面的答案,以下方法对我有效:
将 UINavigationControllerDelegate, UIImagePickerControllerDelegate
实现到你的 UIViewController
中,并设置
imagePickerController.delegate = self;
-(void) navigationController: (UINavigationController *) navigationController willShowViewController: (UIViewController *) viewController animated: (BOOL) animated {
navigationController.navigationBar.barStyle = UIBarStyleBlack;
}
我也遇到了同样的问题,需要管理在不同的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];
}
UIImagePickerController
的扩展中覆盖preferredStatusBarStyle
。这个原则可以很好地应用于第三方库。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
UIImagePickerController
是UINavigationController
的子类,而该委托方法在每次您在导航控制器堆栈上呈现另一个视图控制器时都会被调用。 - barndogsetStatusBarStyle
在 iOS 9 中已被弃用。 - Huy Le