为什么我隐藏图片时状态栏向后滑动了 20 点?

Why is the status bar sliding back of 20 points my image when I hide it?

调用 UIImagePickerController 时似乎存在错误。即使不应该显示状态栏。

解决方法是使用子类化它:

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 = MyImagePickerController()

    picker.allowsEditing = false
    picker.sourceType = .SavedPhotosAlbum
    picker.modalPresentationStyle = .Popover
    self.presentViewController(picker, animated: true, completion: nil)
    picker.popoverPresentationController?.sourceRect = CGRectMake(0,0,0,0)
    picker.popoverPresentationController?.sourceView = self.view

但是,状态栏被隐藏了,但是 它通过向下约 20 点的约束滑动连接到视图的图像。我该如何解决这个问题?

我在编辑图像时一直在努力处理这个 20 偏移量。这对我来说也是一个错误。

唯一对我有用的是在 info.list 中,将 View controller-based status bar appearance 设置为 YES。看看你有没有这套。

然后,如果你想修改某些视图控制器中的状态栏,请转到每个需要更改它的视图控制器。

我设法通过控制 imagePickerController 中的导航栏解决了我的问题。 可能对您有用,但这取决于您问题的确切上下文(即显示 imagePicker 之前的视图层次结构状态)。

与我的 一样,您将 UIImagePickerController 子类化。这又是 UINavigationController 的子类,因此您可以访问它的导航栏。

class WNImagePickerControllerSwift: UIImagePickerController {

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

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        self.setNavBar()
    }

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

    override func childViewControllerForStatusBarHidden() -> UIViewController? {
        return nil;
    }

    func setNavBar() -> Void {
        self.setNavBar(65)
    }


    func setNavBar(height: CGFloat) -> Void {
        var frame = self.navigationBar.frame;
        frame.size.height = height;
        self.navigationBar.frame = frame;
    }

}

setNavBar 必须恰好在这两个地方被调用——一次是在调用 prefersStatusBarHidden 时的动画转换之前,一次是在转换之后。在viewWillAppear.

中直接调用是不行的

无论如何都值得一试,使用神奇的数字 65 来适应您所追求的导航栏高度。