为什么在Swift中调用popoverPresentationController时状态栏会出现?

在我的应用程序中,你可以点击一个UIButton和popup窗口popup,并显示用户的照片库。

我正在使用这个代码来实现这一点:

  let picker = UIImagePickerController() picker.allowsEditing = false picker.sourceType = .PhotoLibrary picker.modalPresentationStyle = .Popover self.presentViewController(picker, animated: true, completion: nil) picker.popoverPresentationController?.sourceRect = CGRectMake(600,180,0,0) picker.popoverPresentationController?.sourceView = self.view 

上面的代码工作正常,并向用户显示popup窗口。 但是, 它也显示一个白色的状态栏

我试图用很多方式隐藏状态栏:

 UIApplication.sharedApplication().statusBarHidden = true 

我确信info.plist文件中的这个String被设置为NOView controller-based status bar appearance

我的class上也有这样的代码:

  override func prefersStatusBarHidden() -> Bool { return true } 

UIViewController属性检查器看起来像这样:

Imgur

不幸的是,popover仍然显示状态栏。 为什么? 我该如何解决这个问题?

无论您的应用程序设置如何,ImagePickerController都非常热衷于显示状态栏。 我设法通过inheritanceImagePickerController并覆盖viewWillAppearprefersStatusBarHidden

 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.setNeedsStatusBarAppearanceUpdate() } override func prefersStatusBarHidden() -> Bool { return true } 

如果您的imagePicker sourceType.SavedPhotosAlbum但是如果sourceType.PhotoLibrary那么这个解决schemesourceType .PhotoLibrary 。 后者的源types为您提供了imagePickerController中的导航选项。 在您控制第一个屏幕的状态栏时,只要您导航到“ 时刻”或“ 相机胶卷” ,就会失去该控件。 状态栏重新出现,更糟的是viewControllers之间的animation转换真的搞砸了。 通过拦截UINavigationController委托方法(UIImagePickerController是UINavigationController的子类),您可以获得对进程的更多控制,但是我只成功地使用了soureType = .SavedPhotosAlbum

编辑

你可能还必须包括这个:

 override func childViewControllerForStatusBarHidden() -> UIViewController? { return nil; } 

完全神秘的原因!

EDIT2

把它放在一起…

 class MyImagePickerController: UIImagePickerController { override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.setNeedsStatusBarAppearanceUpdate() } override func prefersStatusBarHidden() -> Bool { return true } override func childViewControllerForStatusBarHidden() -> UIViewController? { return nil; } } 

然后你改变这一行:

 let picker = UIImagePickerController() 

至:

 let picker = MyImagePickerController()