Comment faire UIPopoverController de garder la même position après la rotation?
Je ne peux pas garder la liste de la même position sur l'écran après la rotation. Est-il une bonne façon de le faire, parce que tout simplement la définition de certains châssis de fenêtre pop-over fonctionne terrible, après la rotation.popover.frame = CGRectMake(someFrame);
Après la rotation liste semble bien que si il est dans le centre de l'écran.
- Il suffit de vérifier ce lien aussi.. stackoverflow.com/questions/3670981/...
- Merci pour : presentPopoverFromRect:inView peuvent être utilisés lorsque la liste est visible
Vous devez vous connecter pour publier un commentaire.
Apple a un Q&A sur exactement ce problème. Vous pouvez trouver les détails ici:
Technique Q&UN QA1694 Manipulation Liste des Contrôleurs Lors de Changements d'Orientation de l'
Fondamentalement, la technique explique que, de votre point de vue du contrôleur de
didRotateFromInterfaceOrientation
méthode, vous présenter le plus pop à nouveau comme suit:Pour plus d'informations, lire l'article ci-dessus, et aussi le UIPopoverController De Référence De Classe:
Comme d'iOS 8.0.2 willRotateToInterfaceOrientation n'auront aucun effet. Comme mhrrt mentionné, vous devez utiliser la méthode du délégué:
- (void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view
Ainsi, par exemple, si vous voulez que votre liste à apparaître directement ci-dessous, un bouton a été pressé, vous pouvez utiliser le code suivant:
Dans iOS 7, vous pouvez utiliser
- (void)popoverController:(UIPopoverController *)popoverController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing *)view
pour repositionner votre UIPopoverController sur l'interface de changement d'orientation.Voir le
UIPopoverControllerDelegate
la documentation.Vous pouvez le faire dans
didRotateFromInterfaceOrientation:
méthode de la vue-contrôleur que vous avez utilisé pour présenter la liste.Utilisation
setPopoverContentSize:animated:
méthode pour le réglage de la taille de la liste.J'ai essayé juste pour définir de nouvelles rect (rect.initialiser(...)) et cela fonctionne.
UIPopoverController
a été dépréciée en ios9 en faveur de UIPopoverPresentationController introduit dans ios8. (Je suis passé par cette transition lors du passage deUIActionSheet
àUIAlertController
.) Vous avez deux choix (exemple en obj-C):A. mettre en Œuvre les
UIViewController
méthode ci-dessous (UIKit appelle cette méthode avant de changer la taille d'une présentés vue du contrôleur de la vue).B. Alternativement, lors de la configuration de votre
UIPopoverPresentationController
à présent, également mis son délégué. par exemple, votre présentation de capital de risque peut mettre en œuvreUIPopoverPresentationControllerDelegate
et attribuer lui-même en tant que délégué. Puis de mettre en œuvre la méthode du délégué:Pour Swift:
J'ai le même problème, qui je le résoudre par cette
Où
myfield
s'agit de l'image à partir de laquelle vous voulez afficher votre liste etmyscrollview
est le conteneur de la vue dans laquelle vous ajoutez à votre liste en tant que sous-vue(dans mon cas sa ma scrollview, au lieu de mettreinView:self.view
- je utiliserinView:myscrollview
).J'ai eu le même problème. Au lieu d'effectuer
-presentPopoverFromRect
à chaque fois en gardant la trace de la source rectangle /vue à partir de laquelle elle est présentée, je l'ai sous-classéUIPopoverController
. Après l'avoir fait, tout ce que vous avez à faire est de définir le UIBarButtonItem /UIView d'où la liste sera affichée. Vous pouvez même opter pour l'affichage de la liste d'image personnalisée qui peut être transmis sous la forme d'un NSString valeur.CSPopoverController.h:
CSPopoverController.m:
Utilisation:
Si c'est un UIBarButtonItem de là où vous êtes en les présentant:
Si c'est une UIView d'où la présentation de la liste:
Pour iOS > 8 Jean Grévistes réponse aidé, mais ne faites pas ce que je voulais faire.
Voici la solution qui a fonctionné pour moi. (Si vous voulez télécharger un échantillon complet du projet c'est ici: https://github.com/appteur/uipopoverExample)
J'ai créé une propriété pour contenir toute liste que je voulais présenter, et a également ajouté une propriété de suivre le sourceRect et l'autre pour la vue sur le bouton je voulais la liste flèches à point.
Le bouton qui a déclenché ma liste est dans un UIToolbar. Lorsque vous appuyez dessus, il exécute la méthode suivante qui crée et lance la liste.
Le " setupPopover:withSourceView:sourceRect:contentSize méthode est tout simplement une méthode pratique pour définir la popoverPresentationController propriétés si vous prévoyez d'afficher plusieurs popovers et que vous voulez leur configurés de la même. C'est la mise en œuvre est ci-dessous.
Pour iOS 8 et le viewWillTransitionToSize:withTransitionCoordinator obtenir ce qu'on appelle sur le point de vue du contrôleur lorsque l'appareil tourne.
J'ai mis en œuvre cette méthode dans ma présentation-vue-contrôleur de classe, comme indiqué ci-dessous.
Swift 3:
didRotate
est deprecated. Vous devriez être en utilisant l'une des deux approches, je l'ai mentionné dans stackoverflow.com/a/41561021/954643, par exemplepopoverPresentationController(_:willRepositionPopoverTo:in:)
(docs) C'est en partie parce que vous pouvez changer la mise en page d'un écran de plus de rotations maintenant, comme par le biais de l'écran partagé multitâche fonctionnalités dans ios9+J'ai popoverPresentationController que je présente sur un point de vue qui a un "faux" de la barre de navigation. Donc je ne peux pas joindre le popoverPresentationController à un barButtonItem. Mon menu contextuel s'affiche à la bonne place mais ne fonctionne pas quand l'écran pivote.
Pour une raison
popoverPresentationController(_ popoverPresentationController: UIPopoverPresentationController, willRepositionPopoverTo rect: UnsafeMutablePointer<CGRect>, in view: AutoreleasingUnsafeMutablePointer<UIView>)
ne pas appelée pour moi.Pour contourner ce (iOS 12, Swift 4.2), j'ai ajouté des contraintes à la fenêtre, dans la réalisation de fermeture lors de l'appel des présents. Maintenant, mon popup reste là où je m'attends trop.
Initialiser La Liste Contrôleur
Écrire Defination de Liste Contrôleur
Présente Liste Contrôleur
auto.présent(popoverContent, animée: c'est vrai, d'achèvement:néant)
Écrire ci-dessous la méthode et de leur attribuer de nouvelles de la taille de fenêtre pop-over:
remplacer func viewWillTransition(de taille: CGSize, avec le coordinateur: UIViewControllerTransitionCoordinator) {
laissez-liste = popoverContent?.popoverPresentationController!
liste?.sourceRect = CGRect(x: la taille.largeur/2, y: taille.hauteur/2, largeur: 0, hauteur: 0)
}