为什么在Swift中调用popoverPresentationController会出现状态栏?
Why does the status bar appear when popoverPresentationController is called in Swift?
在我的应用程序中,您可以点击 UIButton
,弹出窗口会弹出并显示用户的照片库。
我正在使用此代码来实现:
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
上面的代码工作正常并且确实向用户显示了弹出窗口。然而,它也显示了一个白色的状态栏。
我尝试了很多隐藏状态栏的方法:
UIApplication.sharedApplication().statusBarHidden = true
我确保 info.plist 文件中的这个 String
设置为 NO
:View controller-based status bar appearance
.
我的 class:
中也有这个代码
override func prefersStatusBarHidden() -> Bool {
return true
}
UIViewController
属性检查器如下所示:
不幸的是,弹出窗口仍然显示状态栏。为什么?我该如何解决?
无论您的应用程序设置如何,ImagePickerController 都非常热衷于显示状态栏。我设法通过子类化 ImagePickerController 并覆盖 viewWillAppear
和 prefersStatusBarHidden
:
来压制它
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.setNeedsStatusBarAppearanceUpdate()
}
override func prefersStatusBarHidden() -> Bool {
return true
}
如果您的 imagePicker sourceType
是 .SavedPhotosAlbum
,此解决方案很好,但如果 sourceType
是 .PhotoLibrary
,则效果不佳。后一种源类型为您提供了 imagePickerController 中的导航选项。当第一个屏幕的状态栏在您的控制之下时,您一旦导航到 Moments 或 Camera Roll,就会失去该控制。状态栏重新出现,更糟的是,viewController 之间的动画转换真的一团糟。您可以通过拦截 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()
在我的应用程序中,您可以点击 UIButton
,弹出窗口会弹出并显示用户的照片库。
我正在使用此代码来实现:
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
上面的代码工作正常并且确实向用户显示了弹出窗口。然而,它也显示了一个白色的状态栏。
我尝试了很多隐藏状态栏的方法:
UIApplication.sharedApplication().statusBarHidden = true
我确保 info.plist 文件中的这个 String
设置为 NO
:View controller-based status bar appearance
.
我的 class:
中也有这个代码 override func prefersStatusBarHidden() -> Bool {
return true
}
UIViewController
属性检查器如下所示:
不幸的是,弹出窗口仍然显示状态栏。为什么?我该如何解决?
无论您的应用程序设置如何,ImagePickerController 都非常热衷于显示状态栏。我设法通过子类化 ImagePickerController 并覆盖 viewWillAppear
和 prefersStatusBarHidden
:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.setNeedsStatusBarAppearanceUpdate()
}
override func prefersStatusBarHidden() -> Bool {
return true
}
如果您的 imagePicker sourceType
是 .SavedPhotosAlbum
,此解决方案很好,但如果 sourceType
是 .PhotoLibrary
,则效果不佳。后一种源类型为您提供了 imagePickerController 中的导航选项。当第一个屏幕的状态栏在您的控制之下时,您一旦导航到 Moments 或 Camera Roll,就会失去该控制。状态栏重新出现,更糟的是,viewController 之间的动画转换真的一团糟。您可以通过拦截 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()