【问题标题】:Why does the status bar appear when popoverPresentationController is called in Swift?为什么在 Swift 中调用 popoverPresentationController 时会出现状态栏?
【发布时间】:2015-01-30 10:44:40
【问题描述】:

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

我的课堂上也有这段代码:

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

UIViewController 属性检查器如下所示:

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

【问题讨论】:

    标签: ios swift popover


    【解决方案1】:

    无论您的应用设置如何,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 中的导航选项。虽然第一个屏幕的状态栏在您的控制之下,但一旦您导航到 Moments相机胶卷,您就会失去该控制。状态栏重新出现,更糟糕的是,viewControllers 之间的动画转换真的搞砸了。您可以通过拦截 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()
    

    【讨论】:

    • 非常感谢。对此,我真的非常感激。请原谅我的无知,但是我必须在哪里放置您发布的代码?我将它放在我的UIViewController 类中,在任何其他方法之外。那正确吗?再次感谢!
    • 我成功了!非常感谢。虽然状态栏没有显示,因为它是不可见的,但它的空间(大约 20 像素)会向下滚动一点背景图像。有什么解决办法吗?谢谢!
    • @CeceXX... 因为这个答案是该问题的正确解决方案,请勾选接受。然后我们可以move on 到您的new questions
    • 感谢您的帮助。
    猜你喜欢
    • 2022-10-17
    • 1970-01-01
    • 2018-03-31
    • 2019-02-10
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多