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 并覆盖 prefersStatusBarHidden
和 childViewControllerForStatusBarHidden
。
@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 上的相机控件重叠的主要内容,如果未能解决你的问题,请参考以下文章