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

时间:2015-01-30 10:44:40

标签: 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

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

我的课程中也有这个代码:

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

UIViewController属性检查器如下所示:

Imgur

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

1 个答案:

答案 0 :(得分:2)

无论您的应用设置如何,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 Camera Roll ,就会失去该控件。状态栏重新出现 - 更糟糕的是 - 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()