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:
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()