为什么在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
被设置为NO
: View controller-based status bar appearance
。
我的class上也有这样的代码:
override func prefersStatusBarHidden() -> Bool { return true }
UIViewController
属性检查器看起来像这样:
不幸的是,popover仍然显示状态栏。 为什么? 我该如何解决这个问题?
无论您的应用程序设置如何,ImagePickerController都非常热衷于显示状态栏。 我设法通过inheritanceImagePickerController并覆盖viewWillAppear
和prefersStatusBarHidden
:
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()