裁剪中的UIImagePickerController状态栏问题

时间:2014-12-07 15:51:30

标签: ios objective-c uiimagepickercontroller statusbar

我使用UIViewControllerBasedStatusBarAppearancepreferredStatusBarStyle来管理状态栏的颜色和外观。

我的应用可让用户从相机胶卷中选择一张照片,并使用UIImagePickerController的原生裁剪选项将其裁剪为方形。

所以我按下UIImagePickerController并启用编辑以获取裁剪屏幕 问题是,我希望对于相册和照片视图,状态栏将为白色,而对于裁剪视图,我想要隐藏状态栏。

如何使用preferredStatusBarStyle执行此操作?

直到现在我为UIImagePickerController制作了一个类别并实施了:

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}  

这确实将状态栏设置为照片中的白色,但是当进入裁剪视图时,状态栏变为黑色,这对我有好处,因为我想隐藏它并且背景是黑色的,所以你可以&#39 ;看到它,但电池指示灯是绿色的!所以你只能在状态栏中看到电池指示灯!

我该如何解决?如何仅在裁剪视图中隐藏状态栏?

2 个答案:

答案 0 :(得分:0)

你必须在这里做一些侦探工作,但我可以给你带头。

我建议继承UIImagePickerController并根据显示的子控制器返回状态栏首选项。

UIViewController有两种方法可以控制状态栏的可见性和外观:

- (BOOL)prefersStatusBarHidden;
- (UIStatusBarStyle)preferredStatusBarStyle

只需覆盖它们,无需super来电。

您可以访问子类中的视图控制器堆栈,以便根据堆栈上的控制器数量选择状态栏的首选样式和可见性。

我有一种感觉,每次新的子控制器推入堆栈时,UIKit都会ping preferredStatusBarStyleprefersStatusBarHidden

如果没有,那么您可以通过调用:

强制UIKit更新状态栏
[self setNeedsStatusBarAppearanceUpdate]

由于UIImagePickerControllerUINavigationController的子类,您可以为其分配自己的委托,监视新控制器何时推送到堆栈并调用上面建议的代码。

答案 1 :(得分:0)

Andy帖子的后续排序,是子类UIImagePickerController曾经被禁止但现在被允许。尝试覆盖prefersStatusBarHiddenpreferredStatusBarStyle时会出现一些意外问题。

注意UIImagePickerControllerUINavigationController的子类,因此它本身就是子视图控制器的容器。容器视图控制器如何通过覆盖childViewControllerForStatusBarHiddenchildViewControllerForStatusBarStyle来控制其子项的状态栏可见性和样式。通常UINavigationController不会实现这些,通常会覆盖它们以返回当前可见的视图控制器。

在这种情况下,如果您不控制子视图控制器,您的选择器子类可以覆盖这些方法以返回nil,然后您的prefer方法的实现应该采取过度。从理论上讲,你只需要让他们在合适的时间返回你需要的东西,但正如我的经验所证明的那样,UIImagePickerController和状态栏样式有些可疑。


对于我自己的UIImagePickerController子类,我不关心子视图控制器给定其自定义UI,但我已经尝试从nil返回childViewController..并覆盖{{ 1}}方法。我发现控制可见性工作正常,但是选择器中的某些内容可以抵消从prefer返回LightContent的子类。请参阅my own question