iOS 7 状态栏与 UIImagePickerController 上的相机控件重叠

Posted

技术标签:

【中文标题】iOS 7 状态栏与 UIImagePickerController 上的相机控件重叠【英文标题】:iOS 7 status bar overlaps camera controls on UIImagePickerController 【发布时间】:2013-09-22 07:00:06 【问题描述】:

我尝试将 Info.plist '基于控制器的状态栏外观'设置为 NO,我尝试调用

[[UIApplication sharedApplication] setStatusBarHidden:YES];

我试过了

-(BOOL)prefersStatusBarHidden 
  return YES;

我尝试使用

启动选择器
[self presentViewController:picker animated:NO completion:^
  [[UIApplication sharedApplication] setStatusBarHidden:YES];

还有一个状态栏与相机控件重叠。不过它只存在于 ios 7 中。

状态栏不会显示在应用程序的任何其他位置。我觉得我在这里遗漏了一块重要的拼图,并且没有多少关于 View Controller 或 UIImagePickerController 的阅读可以帮助我找到所说的拼图。

我希望其他人对这个问题有一点了解。谢谢。

编辑:我想要的效果是状态栏显示在应用程序中,除了相机选择器和我们使用的一些其他“外部”(电子邮件相关)视图控制器。

【问题讨论】:

【参考方案1】:

如果你想保留ViewController-Based Status Bar Appearance,继承 UIImagePickerController 并覆盖 prefersStatusBarHiddenchildViewControllerForStatusBarHidden

@interface NoStatusBarImagePickerController : UIImagePickerController
@end

@implementation NoStatusBarImagePickerController

- (BOOL)prefersStatusBarHidden 
  return YES;


- (UIViewController *)childViewControllerForStatusBarHidden 
  return nil;


@end

【讨论】:

来自关于 UIImagePickerController 的苹果文档:重要提示:UIImagePickerController 类仅支持纵向模式。此类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改,但有一个例外。您可以将自定义视图分配给 cameraOverlayView 属性,并使用该视图来呈现附加信息或管理相机界面和代码之间的交互。 所以请不要再为这个答案投票了。 我同意如果任何选择器方法被覆盖,但只有基本的 UIViewController 行为是定制的,并且是以预期的方式。每个人都有自己的解释文档,但我不认为我在精神上违反任何规则,我当然希望 Apple 的 SDK 实现至少在封装方面表现得足够好,这是可以接受的。 好吧,无论是否违反文档精神,它仍然无法解决我的问题。不过感谢您的建议 - 这是一次值得的尝试! IT WORKS ... Alpha,我必须完全同意 masmor。这是“不是真的”子类化。你丝毫没有改变课堂上的任何东西。你只是 - 让我们这样说 - 关于视图控制器的“改变偏好”。这是一个令人难以置信的答案,masmor,谢谢。真的,谢谢。【参考方案2】:

试试这个:

- (void)navigationController:(UINavigationController *)navigationController     willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

    [[UIApplication sharedApplication] setStatusBarHidden:YES];

在您的 appDelegate 中。

【讨论】:

上面的第二行:我在我的应用程序委托中尝试过,但没有成功。 @alphanumericcharacter 你我尝试在实现 UIImagePickerDelegate 的类中添加它。这其实是 UINavigationControllerDelegate 的一个方法。 这个解决方案对我有用,但你必须在你正在实现 UIImagePickerDelegate 的那个类中添加这个 UINavigationControllerDelegate 方法,然后就可以了。【参考方案3】:

从 iOS 7 开始,您需要打开一个额外的设置。在您应用的 Info.plist 中,为 View controller-based status bar appearance 添加一行布尔值,并将其设置为 NO。

【讨论】:

iOS 7 中的Bug,关闭图像选择器时必须隐藏状态栏。创建一个子类并将其放在 viewWillDisappear 中。 我不希望 UIImagePickerController 上出现状态栏。我确实想要在我的应用程序中使用它。我尝试子类化 UIImagePickerController,但 perfersStatusBarHidden 从未被调用,并且状态栏仍然显示。 你绝对不应该这样做。该设置仅用于与古代 iOS 进行某种奇怪的向后兼容。这将导致巨大的问题。只需做masmor的解决方案:它非常简单。只需点击“new File...”并在 Xcode 中选择“Objective C Class...”.. 需要 5 秒。【参考方案4】:

PsychoDad 方法对我有用。我把下面的

[[UIApplication sharedApplication] setStatusBarHidden:YES];

进入 UIImagePickerController 子类的 viewWillDisappear 方法。

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

不过我觉得这是IOS 7的BUG...

【讨论】:

【参考方案5】:

“查看基于控制器的状态栏外观”设置为 NO,对我有用。

【讨论】:

您是否以编程方式设置? @JigPatel 不,它在“p-list”文件中 我希望在我的应用程序中的每个位置都有状态栏,UIImagePickerController 除外。我无法阻止它出现在那里,它与选择器控件重叠。另外,我已经尝试在 info.plist 中设置它,虽然它确实从我的应用程序的每个位置删除了状态栏,但我无法让它显示,即使使用其他一些应该的方法让它出现。我倾向于同意这是一个 iOS7 错误。【参考方案6】:

你应该离开

-(BOOL)prefersStatusBarHidden 
  return YES;

并添加这个

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

【讨论】:

【参考方案7】:

我一直在修复 iOS7 的 ToonPAINT 的这个错误以及最终工作的东西,而不是在 Info.plist 文件中设置这两个东西(状态栏最初隐藏 = 否;查看基于控制器的状态栏外观 =没有)

是为了改变状态栏的样式(尽管我根本不希望它显示出来);仅仅隐藏状态栏是不够的;听起来像是 iOS7 的错误。

在应用委托中添加:

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

NB .. UIStatusBarStyleBlackTranslucent 已被弃用,如果尝试这样做可能使用 UIStatusBarStyleLightContent

【讨论】:

我倾向于同意这是一个 iOS 7 错误。我已经尝试了无数种不同的方法来解决这个问题,但还没有解决方案。【参考方案8】:

我认为这个问题的答案是“这是一个 iOS 7 错误”。在我们的案例中,这里的任何方法都没有帮助,现在有几个人试图解决这个问题。

我不能说重现此问题的步骤,但我已经看到足够多的人遇到同样的问题,我认为可以肯定地说这实际上是一个 iOS 7 错误。大多数人可以使用上面列出的多种方法来解决这个问题。但是,很少有这种方法无法解决。我希望,如果您正在阅读本文,您不是其中之一。

【讨论】:

我实际上刚刚得到了修复。【参考方案9】:

这对我有用:

@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;

【讨论】:

以上是关于iOS 7 状态栏与 UIImagePickerController 上的相机控件重叠的主要内容,如果未能解决你的问题,请参考以下文章

让导航栏与iOS 7中的状态栏重叠

在 iOS 7 中让导航栏与状态栏重叠

IBM Worklight - iOS 7 状态栏与应用程序的 HTML 重叠

iOS:向应用程序窗口添加导航栏与状态栏冲突

iOS11中没有状态栏的导航栏与安全区域重叠

Xamarin Forms - 状态栏与 IOS 中的内容重叠(safeareainsets 问题)