Ios7 UIImagePickerController中断状态栏外观

Ios7 UIImagePickerController中断状态栏外观,ios7,Ios7,在.plist文件中,我将“基于视图控制器的状态栏外观”设置为NO。但是在UIImagePickerController之后,我的应用程序的行为就好像该选项被设置为YES 在我的应用程序中,我展示了一个VC,它展示了一个UIImagePickerController 问题是这样的: 显示“照片选择器”后,当拾取照片库时,状态栏文本的颜色将发生变化 然后,一旦,UIImagePickerController被解除,状态栏间距 “我的应用”其余部分和其他控制器的所有导航栏的更改显示在状态栏下 是

在.plist文件中,我将“基于视图控制器的状态栏外观”设置为
NO
。但是在
UIImagePickerController
之后,我的应用程序的行为就好像该选项被设置为
YES

在我的应用程序中,我展示了一个VC,它展示了一个
UIImagePickerController

问题是这样的:

  • 显示“照片选择器”后,当拾取照片库时,状态栏文本的颜色将发生变化
  • 然后,一旦,
    UIImagePickerController
    被解除,状态栏间距 “我的应用”其余部分和其他控制器的所有导航栏的更改显示在状态栏下

是否有一种方法可以解决此问题,而无需在“我的视图控制器”中管理状态栏?

当显示视图控制器时,您是否尝试调用
[self-setNeedsStatusBarAppearanceUpdate]

我今天也面临同样的问题。这是我的解决办法

在调用图像选择器的视图控制器中,将自己设置为图像选择器的代理。(您可能已经在这样做了)

由于UIImagePickerController是一种导航控制器,因此您还将自己设置为UINavigationController委托。然后:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

用您想要的任何样式替换UIStatusBarStyleLightContent。

这可能是一个bug。我通过将“基于视图控制器的状态栏外观”设置为“是”解决了此问题,并在每个视图控制器中粘贴以下代码:

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

然后,我的应用程序会按预期运行。

我也遇到了同样的问题

这是我的解决办法。 将其放入要从中打开图像选取视图的视图控制器的视图中

-(void) viewWillAppear:(BOOL)animated{
[super viewWillAppear:YES];

[[UIApplication sharedApplication] setStatusBarHidden:YES];

}

我试图在iOS7的UIImagePickerController中隐藏状态栏,但我仍然不知道如何做到这一点。我用

- (void)viewWillAppear:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES
                                        withAnimation:UIStatusBarAnimationNone];
}

在调用UIImagePickerController的ViewController中,并在plist文件中设置“基于视图控制器的状态栏外观=否”。希望这能有所帮助。

上述解决方案中没有一个对我有效,但通过结合Rich86man和iOS_DEV_09的答案,我得到了一个始终如一的有效解决方案:

UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;


关于这个了不起的解决方案。对于2014/iOS8,我发现在某些情况下,您还需要包括
prefersStatusBarHidden
以及可能的
childViewControllerForStatusBarHidden
,因此

-(void)navigationController:(UINavigationController *)navigationController
        willShowViewController:(UIViewController *)viewController
        animated:(BOOL)animated
    {
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }

-(BOOL)prefersStatusBarHidden   // iOS8 definitely needs this one. checked.
    {
    return YES;
    }

-(UIViewController *)childViewControllerForStatusBarHidden
    {
    return nil;
    }

-(void)showCamera
    {
    self.cameraController = [[UIImagePickerController alloc] init];
    self.cameraController.delegate = (id)self; // dpjanes solution!
    etc...

你能试试这个吗。我认为NeedsStatusBaraperanceUpdate将起作用

1 -Set UIViewControllerBasedStatusBarAppearance to NO.
2- Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
3- [self setNeedsStatusBarAppearanceUpdate];

要在UIImagePicker中隐藏状态栏,请执行以下操作:

-

当解除UIImagePicker以隐藏视图控制器中的状态栏时,请使用以下代码:

-(void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:YES];

    [[UIApplication sharedApplication] setStatusBarHidden:YES];

}
试试这个:

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
在协议实现中,使用以下命令:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}
试试这个

这在两种情况下都适用,即是否使用presentModalViewController和pushViewController

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
     if([navigationController isKindOfClass:[UIImagePickerController class]])
         [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
 }
委托方法

-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [picker dismissViewControllerAnimated:YES completion:^{}];
}


- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [picker dismissViewControllerAnimated:YES completion:nil];
}

这为我解决了问题…:

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [picker dismissViewControllerAnimated:YES completion:nil];
}
我也有同样的问题。 外接程序信息列表:“查看基于控制器的状态栏外观”,值为“否”

这里的例子


这个解决方案对我很有效。

这里没有任何东西能特别解决我的问题(也许OP也有),所以我想我会分享我的答案。而不是隐藏状态栏,我认为这是一个有缺陷的解决方案(我注意到它有时会让我的应用程序处于一种状态,状态栏在不应该隐藏的时候被隐藏)。相反,我选择尝试使用
UIStatusBarStyles

当UIImagePickerController显示其视图时,我将状态栏样式设置为默认,因为默认背景颜色为浅灰色

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];
}
然后,当图像选择器被解除时,我将其设置回
UIStatusBarStyleLightContent

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    //work

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

    [self dismissViewControllerAnimated:YES completion:NULL];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{ 
    //work

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

    [self dismissViewControllerAnimated:YES completion:NULL];
}

我发现这提供了适当的处理,有两个部分

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
}


- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
...
UIImagePickerController本身显示视图控制器,因此此委托适用于堆栈上的所有演示者


ViewWillDisplay确保每当显示视图控制器在其上方解除时,始终重置该视图控制器本身。

在这种情况下,我们使用两个步骤

第一步: 外接程序info.plist:“查看基于控制器的状态栏外观”,值为“否”

第二步:通过UIImagePickerController的委托使用/调用此代码

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
     if([navigationController isKindOfClass:[UIImagePickerController class]])
         [[UIApplication sharedApplication] setStatusBarHidden:YES]; 
 }
如果是IOS-7,请再添加一个功能

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

如果在.plist文件中将“基于视图控制器的状态栏外观”设置为“否”,则接受的答案将有效。如果确实需要控制某些其他视图控制器中的状态栏,并将此选项设置为“是”,则使UIImagePickerController正常工作的另一种方法是将其子类化

// .h
@interface MYImagePickerController : UIImagePickerController
@end

// .m
@implementation MYImagePickerController
- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent; // change this to match your style
}
@end

所有这些对我都不起作用。我通过将演示样式更改为:

imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;

上述解决方案对我都不起作用

我提出UIImagePickerController作为模态视图控制器。解除UIImagePickerController后,状态栏状态为:

[UIApplication sharedApplication].statusBarOrientation = 0 (UIDeviceOrientationUnknown)
[UIApplication sharedApplication].statusBarFrame = { 0, 0, 0, 0}
为我解决问题的解决方案是在关闭UIImagePickerController后恢复statusBarOrientation:

UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
[self.viewController presentViewController:cameraUI animated:true completion:^(void){ }];

...

[self.viewController dismissViewControllerAnimated:animated completion:^(void){
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
}];
- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}

这段代码帮助我自定义状态栏样式

编辑:如果“查看基于控制器的状态栏外观”==是,则此解决方案有效


从iOS 8.1开始,似乎他们终于修复了这个bug!我能够从我的代码中删除我使用的所有变通方法。

使用默认的iOS 8行为,当我想要隐藏状态栏时,状态栏出现问题

我找到的解决方案是,在从我的视图控制器调用
presentPopover
后,我立即:

    [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate) withObject:nil afterDelay:0.01];
我还必须将此添加到我的主视图控制器:

UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
[self.viewController presentViewController:cameraUI animated:true completion:^(void){ }];

...

[self.viewController dismissViewControllerAnimated:animated completion:^(void){
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
}];
- (UIViewController *)childViewControllerForStatusBarHidden
{
    return nil;
}

以上所有答案都可以,可以帮助您

我在管理不同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:UIStatusBarStyleDefault];
}
-(无效)导航控制器:(UINavigationController*)导航控制器将显示视图控制器:(UIViewCont)
let imagePicker =  UIImagePickerController()
imagePicker.sourceType = .PhotoLibrary
imagePicker.navigationBar.barStyle = .Black
let pickerController = UIImagePickerController()
pickerController.delegate = self

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
        UIApplication.sharedApplication().setStatusBarStyle(.LightContent, animated: false)
    }