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]; }
上述解决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。