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

标签 ios swift popover

在我的应用程序中,您可以点击 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

我确定了这个String在 info.plist 文件中设置为 NO : View controller-based status bar appearance .

我的课上也有这段代码:

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

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

Imgur

不幸的是,弹出窗口仍然显示状态栏。为什么?我该如何解决?

最佳答案

无论您的应用设置如何,ImagePickerController 都非常热衷于显示状态栏。我设法通过继承 ImagePickerController 并覆盖 viewWillAppearprefersStatusBarHidden 来压制它:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.setNeedsStatusBarAppearanceUpdate()
}

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

如果您的 imagePicker sourceType.SavedPhotosAlbum,此解决方案很好,但如果 sourceType.PhotoLibrary,则效果不佳。后一种源类型为您提供了 imagePickerController 中的导航选项。虽然第一个屏幕的状态栏在您的控制之下,但您一旦导航到时刻相机胶卷,就会失去该控制。状态栏重新出现,更糟的是,viewController 之间的动画转换真的一团糟。您可以通过拦截 UINavigationController 委托(delegate)方法(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()

关于ios - 为什么在Swift中调用popoverPresentationController会出现状态栏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28234143/

相关文章:

ios - swift - NSFetchRequest 按语法排序

swift - 相当于 SpriteKit 中的弹出窗口

javascript - 页面上有多个引导弹出窗口,但只有单击的第一个弹出窗口可以按需要工作

ios - 为 UILocalNotification 设置超时(一段时间后将其从锁屏和通知中心移除)

ios - 关于 UIScrollView 和更改 UIView 所有权的一些帮助

ios - UIImageView/TableFooterView 上的两个 init 方法

javascript - 外部 Bootstrap 弹出窗口(https ://github. com/kartik-v/bootstrap-popover-x)方法和事件不起作用?

ios - 用于离线查看的 Swift iOS 缓存 WKWebView 内容

ios - UITableView 滚动时重新选择行

json - Swift 4 可解码, key 在解码时未知