我使用UIViewControllerBasedStatusBarAppearance
和preferredStatusBarStyle
来管理状态栏的颜色和外观。
我的应用可让用户从相机胶卷中选择一张照片,并使用UIImagePickerController
的原生裁剪选项将其裁剪为方形。
所以我按下UIImagePickerController
并启用编辑以获取裁剪屏幕
问题是,我希望对于相册和照片视图,状态栏将为白色,而对于裁剪视图,我想要隐藏状态栏。
如何使用preferredStatusBarStyle
执行此操作?
直到现在我为UIImagePickerController
制作了一个类别并实施了:
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
这确实将状态栏设置为照片中的白色,但是当进入裁剪视图时,状态栏变为黑色,这对我有好处,因为我想隐藏它并且背景是黑色的,所以你可以&#39 ;看到它,但电池指示灯是绿色的!所以你只能在状态栏中看到电池指示灯!
我该如何解决?如何仅在裁剪视图中隐藏状态栏?
答案 0 :(得分:0)
你必须在这里做一些侦探工作,但我可以给你带头。
我建议继承UIImagePickerController
并根据显示的子控制器返回状态栏首选项。
UIViewController有两种方法可以控制状态栏的可见性和外观:
- (BOOL)prefersStatusBarHidden;
- (UIStatusBarStyle)preferredStatusBarStyle
只需覆盖它们,无需super
来电。
您可以访问子类中的视图控制器堆栈,以便根据堆栈上的控制器数量选择状态栏的首选样式和可见性。
我有一种感觉,每次新的子控制器推入堆栈时,UIKit都会ping preferredStatusBarStyle
和prefersStatusBarHidden
。
如果没有,那么您可以通过调用:
强制UIKit更新状态栏[self setNeedsStatusBarAppearanceUpdate]
由于UIImagePickerController
是UINavigationController
的子类,您可以为其分配自己的委托,监视新控制器何时推送到堆栈并调用上面建议的代码。
答案 1 :(得分:0)
对Andy帖子的后续排序,是子类UIImagePickerController
曾经被禁止但现在被允许。尝试覆盖prefersStatusBarHidden
和preferredStatusBarStyle
时会出现一些意外问题。
注意UIImagePickerController
是UINavigationController
的子类,因此它本身就是子视图控制器的容器。容器视图控制器如何通过覆盖childViewControllerForStatusBarHidden
和childViewControllerForStatusBarStyle
来控制其子项的状态栏可见性和样式。通常UINavigationController
不会实现这些,通常会覆盖它们以返回当前可见的视图控制器。
在这种情况下,如果您不控制子视图控制器,您的选择器子类可以覆盖这些方法以返回nil
,然后您的prefer
方法的实现应该采取过度。从理论上讲,你只需要让他们在合适的时间返回你需要的东西,但正如我的经验所证明的那样,UIImagePickerController
和状态栏样式有些可疑。
对于我自己的UIImagePickerController
子类,我不关心子视图控制器给定其自定义UI,但我已经尝试从nil
返回childViewController..
并覆盖{{ 1}}方法。我发现控制可见性工作正常,但是选择器中的某些内容可以抵消从prefer
返回LightContent
的子类。请参阅my own question。