Pourquoi la barre d'état apparaît-elle lorsque popoverPresentationController est appelée dans Swift?

Dans mon application, vous pouvez appuyer sur un UIButton et un popover apparaît et montre la photothèque de l'user.

J'utilise ce code pour y arriver:

  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 

Le code ci-dessus fonctionne bien et montre le popover à l'user. Cependant, il affiche également une barre d'état blanche .

J'ai essayé de cacher la barre d'état de plusieurs façons:

 UIApplication.sharedApplication().statusBarHidden = true 

J'ai vérifié que cette Ssortingng dans le file info.plist était définie sur NO : View controller-based status bar appearance .

J'ai aussi ce code dans ma class:

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

L'inspecteur d'attributes UIViewController ressemble à ceci:

Imgur

Malheureusement, le popover montre toujours la barre d'état. Pourquoi? Comment puis-je résoudre ce problème?

ImagePickerController est très intéressé par l'affichage d'une barre d'état, quels que soient les parameters de votre application. J'ai réussi à l'écraser en sous-classant ImagePickerController et en surchargeant viewWillAppear et prefersStatusBarHidden :

 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.setNeedsStatusBarAppearanceUpdate() } override func prefersStatusBarHidden() -> Bool { return true } 

Cette solution est correcte si votre imagePicker sourceType est .SavedPhotosAlbum mais ne fonctionne pas si sourceType est .PhotoLibrary . Ce dernier type de source vous présente des options de navigation dans l'imagePickerController. Alors que la barre d'état du premier écran est sous votre contrôle, vous perdez ce contrôle dès que vous naviguez vers Moments ou Camera Roll . La barre d'état réapparaît et, pire encore, les transitions d'animation entre les viewControllers sont vraiment ratées. Vous pouvez get plus de contrôle sur le process en interceptant les methods déléguées UINavigationController (UIImagePickerController est une sous-class de UINavigationController), mais je n'ai réussi que bien avec soureType = .SavedPhotosAlbum

MODIFIER

vous devrez peut-être inclure ceci:

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

pour des raisons complètement mystérieuses!

EDIT2

Mettre tous set…

 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; } } 

Ensuite, vous changez cette ligne:

 let picker = UIImagePickerController() 

à:

 let picker = MyImagePickerController()