UIImagePickerController打破了状态栏的外观

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

在我的应用程序中,我介绍了一个呈现UIImagePickerController的VC。

问题如下所示:

  • 显示照片select器后,select照片库时,状态栏文本的颜色会改变。
  • 然后一次, UIImagePickerController被解散,状态栏间距为我的应用程序的其余部分更改,其他控制器的所有导航栏显示在状态栏下。

有没有办法解决这个问题,而不是在我的视图控制器pipe理状态栏?

上面的解决scheme都没有为我工作,但通过结合Rich86man和iOS_DEV_09的答案,我有一个持续工作的解决scheme:

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

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

关于这个真棒解决scheme。 对于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... 

希望它可以帮助别人

我今天面对同样的问题。 这是我的解决scheme。

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

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

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

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

用您正在查找的任何样式replaceUIStatusBarStyleLightContent。

如果您在.plist文件中将“基于视图控制器的状态栏外观”设置为NO,则接受的答案将起作用。 如果确实需要在其他一些视图控制器中控制状态栏,并将此选项设置为YES,那么使UIImagePickerController正确运行的另一种方法是对其进行子类化

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

我面临同样的问题。

这是我的解决scheme。 把它放在你打开图像选取器的视图控制器的viewWillAppear中

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

你可以试试这个吗? 我认为needsStatusBarApperanceUpdate将工作。

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

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

 - (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本身呈现视图控制器,所以这个委托适用于堆栈中的所有演示者。

viewWillAppear确保视图控制器本身总是被重置,只要呈现的视图控制器在视图控制器上面忽略它。

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

 - (BOOL)prefersStatusBarHidden { return YES; } 

然后我的应用程序按预期行事。

在UIImagePicker中隐藏状态栏:

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

并且当UIImagePicker被解除以隐藏在视图控制器中的状态栏使用下面的代码:

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

尝试这个 ….

这将在两种情况下工作,即是否使用presentModalViewController和pushViewController

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

委托方法

 -(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]; } 

我有同样的问题。 添加信息plist:“查看基于控制器的状态栏外观”,值为“NO”

示例在这里https://stackoverflow.com/a/19211669

这个解决scheme适用于我。

上述解决scheme都不适合我。

我介绍UIImagePickerController作为模式视图控制器。 closuresUIImagePickerController后,状态栏状态为:

 [UIApplication sharedApplication].statusBarOrientation = 0 (UIDeviceOrientationUnknown) [UIApplication sharedApplication].statusBarFrame = { 0, 0, 0, 0} 

为我解决问题的解决scheme是closuresUIImagePickerController后恢复statusBarOrientation:

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

此代码帮助我自定义状态栏样式。

编辑:这个解决scheme工作,如果“查看基于控制器的状态栏外观”==是

 @implementation UIImagePickerController (IOS7_StatusBarStyle) -(UIViewController*)childViewControllerForStatusBarStyle { return nil; } -(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } @end 

以上所有的答案是好的,可以帮助。

我有同样的问题不得不pipe理在不同的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]; } 

而另一种解决scheme可能在某些情况下工作。

 let imagePicker = UIImagePickerController() imagePicker.sourceType = .PhotoLibrary imagePicker.navigationBar.barStyle = .Black 

当您呈现视图控制器重新出现时,您是否尝试调用[self setNeedsStatusBarAppearanceUpdate]

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

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

在调用UIImagePickerController的ViewController中,在plist文件中设置“View controller-status bar appearance = NO”。 希望这可以帮助。

尝试这个 :

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

并在协议工具中使用这个:

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

这为我解决了…:

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

这里没有任何东西能够明确地解决我所遇到的问题(也许OP也有这个问题),所以我想我会分享我的答案。 而不是隐藏状态栏,我认为这是一个错误的解决scheme(我注意到,它有时会离开我的应用程序在状态栏被隐藏的状态,当它不应该)。 我反而select尝试和UIStatusBarStyles一起玩。

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

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

然后,当图像select器被解散时,我将其设置回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]; } 

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

第一步:添加info.plist:“查看基于控制器的状态栏外观”,值为“NO”

在第二步:使用/调用此代码与UIImagePickerController委托

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

在IOS-7的情况下添加一个更多的function

 - (BOOL)prefersStatusBarHidden { return YES; } 

以上所有都不适合我。 我通过更改演示文稿样式解决了问题:

 imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen; 

从iOS 8.1开始,似乎他们终于修复了这个错误! 我能够删除我从我的代码中采用的所有解决方法。

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

我find的解决scheme是,直接从我的视图控制器调用presentPopover ,我做到了:

  [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate) withObject:nil afterDelay:0.01]; 

我也必须添加到我的主视图控制器:

 - (UIViewController *)childViewControllerForStatusBarHidden { return nil; } 

所以我有这个问题,我能够通过简单地实现一个委托函数来解决它。 我的状态栏的背景是黑色的,所以我的应用程序的UIStatusBarStyle是.LightContent。 当我提出UIImagePickerController从设备存储中select一张照片时,状态栏没有问题。 然而,当点击“相机卷”或“collections夹”等目录时,有效地推入导航堆栈,状态栏消失。 select照片后,根本没有状态栏; 在解散另一个模式视图控制器时,只有电池存在,表示状态栏的其余部分也可能是黑色的。

我尝试了一些其他的解决scheme,比如扩展UIImagePickerController,但是在Swift中,你不能使用扩展来重写。 然后我试图inheritanceUIImagePickerController,试图隐藏它的状态栏viewWillAppear()和取消隐藏viewWillDisappear状态栏。 我可以用.Slideanimation看到状态栏隐藏,但是由于状态栏在select目录时是不可见的,所以我无法看到状态栏取消隐藏。 再一次,绿色的电池回来了,状态栏的其余部分在closures模式视图控制器时不可见。 我也尝试覆盖prefersStatusBarHidden(),但该函数从来没有被调用,所以我试图调用setNeedsStatusBarAppearanceUpdate(),以确保系统调用prefersStatusBarHidden(),但它仍然没有被调用。 此外,还有build议设置状态栏隐藏在委托方法navigationController willShowViewController。 所有这一切都是隐藏状态栏,这不能解决问题。 事实certificate,在推入UIImagePickerController的导航堆栈时,似乎状态栏样式发生了改变。 为了完全解决这个问题,我没有写扩展名或子类UIImagePickerController。 所有你需要做的是设置委托,并设置状态栏样式保持不变。 这个增加使得问题从来没有存在过。

 let pickerController = UIImagePickerController() pickerController.delegate = self func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { UIApplication.sharedApplication().setStatusBarStyle(.LightContent, animated: false) } 

实际上我发现了一个更好的方法来设置图像select器中的状态栏背景颜色。 基本上你需要将navigationBar的backgroundImage设置为nil,因为在Image Picker中默认的backgroundImage是一个白色的Image。

Interesting Posts