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