如何制作 UIImagePickerController StatusBar lightContent 样式?
Posted
技术标签:
【中文标题】如何制作 UIImagePickerController StatusBar lightContent 样式?【英文标题】:How to make UIImagePickerController StatusBar lightContent style? 【发布时间】:2014-02-09 03:34:56 【问题描述】:当我展示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];
【讨论】:
之所以有效,是因为UIImagePickerController
是UINavigationController
的子类,并且每次您在导航控制器堆栈上呈现另一个视图控制器时都会调用该委托方法。
setStatusBarStyle
在 ios 9 中已弃用
@barndog imagePicker 显示时如何隐藏状态栏?存在一个错误,即裁剪后的图像会在状态栏的大小上添加 y 偏移量,因为状态栏没有被裁剪掉。【参考方案2】:
通过为 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
【讨论】:
第一个解决方案(自定义初始化程序)对我不起作用。 问题是关于状态栏颜色而不是导航栏颜色。【参考方案3】:在 Swift 和 iOS 9 中,setStatusBarStyle
已弃用。你可以子类化控制器。
private final class LightStatusImagePickerController: UIImagePickerController
override func preferredStatusBarStyle() -> UIStatusBarStyle
return .lightContent
【讨论】:
很好的建议,我认为这是前进的正确方式!但由于某种原因,它对我不起作用。调用被调用,我也尝试了 prefersStatusBarHidden,甚至在 viewDidLoad 中调用了 self.setNeedsStatusBarAppearanceUpdate。状态栏仍显示为 darkContent。 根据 UIImagePickerController 的 Apple 文档,您不应继承控制器。 “UIImagePickerController 类仅支持纵向模式。此类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改,但有一个例外。您可以将自定义视图分配给cameraOverlayView 属性并使用该视图来呈现附加信息或管理相机界面和代码之间的交互。” 在 iOS 13 中不起作用。子类中的方法没有被调用。【参考方案4】:我在管理在不同 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];
【讨论】:
【参考方案5】:使用上面的答案对我有用:
实施
UINavigationControllerDelegate, UIImagePickerControllerDelegate
给你的UIViewController
并设置
imagePickerController.delegate = self;
添加如下方法:
-(void) navigationController: (UINavigationController *) navigationController willShowViewController: (UIViewController *) viewController animated: (BOOL) animated
navigationController.navigationBar.barStyle = UIBarStyleBlack;
【讨论】:
【参考方案6】:我遇到了类似的问题,我发现解决它的最简单方法是在 UIImagePickerController
的扩展中覆盖 preferredStatusBarStyle
,就像这样。该主体可以很好地应用于第三方库。
extension UIImagePickerController
open override var preferredStatusBarStyle: UIStatusBarStyle
if isLightTheme()
return .default // black text
return .lightContent // white text
isLightTheme()
只是一个函数,用于确定该控制器中的 NavigationBar 是浅色还是深色。
【讨论】:
【参考方案7】:这是我能想到的最快的解决方案。创建以下类别:
@implementation UIImagePickerController (LightStatusBar)
- (UIStatusBarStyle)preferredStatusBarStyle
return UIStatusBarStyleLightContent;
@end
【讨论】:
以上是关于如何制作 UIImagePickerController StatusBar lightContent 样式?的主要内容,如果未能解决你的问题,请参考以下文章