iOS 7 状态栏覆盖 UIImagePickerController 上的相机控件

7
我尝试将Info.plist中的“View controller-based status bar appearance”设置为NO,我尝试调用
[[UIApplication sharedApplication] setStatusBarHidden:YES];

我曾尝试过

-(BOOL)prefersStatusBarHidden{ 
  return YES;
}

我尝试使用以下代码启动选择器:
[self presentViewController:picker animated:NO completion:^{
  [[UIApplication sharedApplication] setStatusBarHidden:YES];
}

仍然存在一个状态栏重叠在相机控件上。但这只发生在iOS 7中。
其他地方的应用程序没有状态栏。我感觉我在这里失去了一个重要的部分,阅读有关View Controller或UIImagePickerController的任何内容都没有帮助我找到所谓的难题。
我希望其他人对这个问题有一点了解。谢谢。
编辑:我的期望效果是状态栏显示在应用程序的每个地方,除了相机选择器和我们使用的一些其他“外部”(电子邮件相关的)视图控制器。
9个回答

17
如果您想保留“基于视图控制器的状态栏外观”,则需要子类化UIImagePickerController并覆盖prefersStatusBarHidden和childViewControllerForStatusBarHidden。
@interface NoStatusBarImagePickerController : UIImagePickerController
@end

@implementation NoStatusBarImagePickerController

- (BOOL)prefersStatusBarHidden {
  return YES;
}

- (UIViewController *)childViewControllerForStatusBarHidden {
  return nil;
}

@end

4
重要提示:UIImagePickerController类只支持竖屏模式。该类旨在原样使用,不支持子类化。该类的视图层次结构是私有的,不能被修改,除了一种情况。你可以将自定义视图分配给cameraOverlayView属性,并使用该视图来展示额外的信息或管理摄像机界面和你的代码之间的交互。 - alphanumeric character
2
如果任何选择器方法被覆盖,我会同意,但只有基本的UIViewController行为被定制,并且以一种预期的方式。每个人都可以根据自己的理解来解释文档,但我不认为我在精神上违反了任何规则,我当然希望苹果的SDK实现至少在封装方面表现良好,这是可以接受的。 - voxlet
无论是否违反文档精神,它仍未解决我的问题。感谢您的建议 - 虽然它是一次值得尝试的努力! - alphanumeric character
@alphanumericcharacter 用类别代替怎么样? - psobko
是的,我们尝试过的所有方法都没有解决这个问题。我看到其他人也感到非常沮丧,但这种情况并不常见。看起来这真的是一个iOS的bug,尽管如何可靠地重现它还不清楚。我们组织中的其他几个开发人员也看了一下,每个人都尝试了各种修复方法,但都没有成功。可悲的是,我认为答案就在这里:“如果你不能用几种简单的方法修复它,那么振作起来,因为你无法修复它。” - alphanumeric character
显示剩余4条评论

7

试试这个:

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

在你的 appDelegate 文件中。


上面第二行:我在我的应用程序委托中尝试过,但没有成功。 - alphanumeric character
1
@alphanumericcharacter 你可以尝试在实现UIImagePickerDelegate的类中添加这个方法。实际上,这是UINavigationControllerDelegate的一个方法。 - Abduliam Rehmanius
3
这个解决方案对我有效,但你需要在实现UIImagePickerDelegate的那个类中添加这个UINavigationControllerDelegate方法,然后就可以了。 - prakhar

3

在iOS 7及以上版本中,您需要打开一个额外的设置。在您的应用程序的Info.plist文件中,添加一行View controller-based status bar appearance,它是一个布尔值,并将其设置为NO。


2
iOS 7 中的 Bug,必须在关闭图像选择器时隐藏状态栏。创建一个子类并将其放置在 viewWillDisappear 中。 - jjxtra
我不想在UIImagePickerController上显示状态栏。但是我希望在我的应用程序中显示它。我尝试了子类化UIImagePickerController,但是prefersStatusBarHidden从未被调用,状态栏仍然出现。 - alphanumeric character
你绝对不应该这样做。那个设置只是为了与古老的iOS进行奇怪的向后兼容而存在的。它会引起巨大的问题。只需执行masmor的解决方案:它非常简单。在Xcode中,只需点击“新建文件...”,然后选择“Objective C类...”即可...只需要5秒钟。 - Fattie

1
PsychoDad方法对我很有效。我按照以下方式进行操作。
[[UIApplication sharedApplication] setStatusBarHidden:YES];

进入UIImagePickerController子类的方法viewWillDisappear。

但是Alexandru Dranca的方法更好,因为这样状态栏根本不会出现!

但我认为这是IOS 7的一个BUG...


0

这是对我有效的方法:

@implementation ViewController {
    BOOL hideStatusBar;
}

- (void)showCamera {
    UIImagePickerController *camera = [[UIImagePickerController alloc] init];
    camera.modalPresentationStyle = UIModalPresentationCurrentContext;
    camera.sourceType = UIImagePickerControllerSourceTypeCamera;
    camera.delegate = self;

     hideStatusBar = YES;
    [self setNeedsStatusBarAppearanceUpdate];
    [self presentViewController:camera animated:YES completion:nil];
}

-(BOOL)prefersStatusBarHidden{
    return hideStatusBar;
}

0

你应该离开这个

-(BOOL)prefersStatusBarHidden{ 
  return YES;
}

并且添加这个

-(void)viewWillAppear:(BOOL)animated {
    ...
    [self setNeedsStatusBarAppearanceUpdate];
    ...
}

0

我一直在修复ToonPAINT for iOS7的错误,最终有效的方法是除了在Info.plist文件中设置两个东西(状态栏最初隐藏= NO;基于视图控制器的状态栏外观= NO)之外,改变状态栏的样式(即使我根本不想显示它);仅仅隐藏状态栏是不够的;听起来像是iOS7的一个bug。

在应用程序委托中添加:

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

{NB .. UIStatusBarStyleBlackTranslucent已过期,请尝试使用UIStatusBarStyleLightContent}


我倾向于认为这是iOS 7的一个bug。我已经尝试了无数种不同的修复方法,但还没有解决方案。 - alphanumeric character

0

我认为这个问题的答案是“这是一个iOS 7的bug”。在我们的情况下,这里列出的方法都没有帮助,而且有几个人已经尝试过修复这个问题。

我无法说出重现此问题的步骤,但我已经看到足够多的人遇到了同样的问题,所以我认为可以肯定地说,这确实是一个iOS 7的bug。大多数人可以通过上面列出的多种方法解决这个问题。然而,很少有情况下你不能用这种方式来解决它。我希望如果你正在阅读这篇文章,你不是那些人之一。


我刚刚得到了一个修复。 - Erik Escobedo

0

将“基于视图控制器的状态栏外观”设置为NO,对我有效。


你是否以编程方式设置了? - Jignesh B
@JigPatel 不是的,它在 'p-list' 文件中。 - JerryZhou
我想在我的应用程序中的所有地方都有状态栏,除了UIImagePickerController。我无法阻止它在那里显示,并且它会重叠选择器控件。此外,我已经尝试在info.plist中设置这个选项,虽然它确实从我的应用程序中的所有地方删除了状态栏,但我无法让它显示出来,即使使用了一些其他应该使其出现的方法。我倾向于认为这是iOS7的一个错误。 - alphanumeric character

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接