J'ai un UIPopoverController hébergeant un UINavigationController, qui contient une petite hiérarchie de contrôleurs de vue.
J'ai suivi la documentation et pour chaque contrôleur de vue, j'ai défini la taille du contexte popover de la vue comme suit:
[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];
(taille différente pour chaque contrôleur)
Cela fonctionne comme prévu lorsque je progresse dans la hiérarchie - le popover anime automatiquement les changements de taille pour correspondre au contrôleur poussé.
Cependant, lorsque je navigue "Retour" dans la pile de vues via le bouton Retour de la barre de navigation, le popover ne change pas de taille - il reste aussi grand que la vue la plus profonde atteinte. Cela me semble cassé; Je m'attendrais à ce que le popover respecte les tailles configurées à mesure qu'il apparaît dans la pile de vues.
Est-ce que je manque quelque chose?
Merci.
viewWillAppear:
)?Réponses:
Ok, je luttais avec le même problème. Aucune des solutions ci-dessus n'a fonctionné assez bien pour moi, c'est pourquoi j'ai décidé de faire une petite enquête et de découvrir comment cela fonctionne. Voici ce que j'ai découvert: - Lorsque vous réglez le
contentSizeForViewInPopover
dans votre contrôleur de vue, il ne sera pas modifié par le popover lui-même - même si la taille du popover peut changer lors de la navigation vers un contrôleur différent. - Lorsque la taille du popover changera lors de la navigation vers un contrôleur différent, en revenant, la taille du popover ne sera pas restaurée - Changer la taille du popover dans viewWillAppear donne une animation très étrange (quand disons que vous popController à l'intérieur du popover) - Je ne le recommanderais pas - Pour moi, définir la taille codée en dur à l'intérieur du contrôleur ne fonctionnerait pas du tout - mes contrôleurs doivent être parfois grands parfois petits - le contrôleur qui les présentera a cependant une idée de la tailleUne solution à toute cette douleur est la suivante: Vous devez réinitialiser la taille de
currentSetSizeForPopover
in viewDidAppear. Mais vous devez faire attention, lorsque vous définissez la même taille que celle déjà définie dans le champ,currentSetSizeForPopover
le popover ne changera pas la taille. Pour que cela se produise, vous pouvez d'abord définir la fausse taille (qui sera différente de celle définie auparavant), puis définir la taille appropriée. Cette solution fonctionnera même si votre contrôleur est imbriqué dans le contrôleur de navigation et que le popover changera sa taille en conséquence lorsque vous reviendrez entre les contrôleurs.Vous pouvez facilement créer une catégorie sur UIViewController avec la méthode d'assistance suivante qui ferait l'affaire en définissant la taille:
Ensuite, appelez-le simplement dans
-viewDidAppear
le contrôleur souhaité.la source
Voici comment je l'ai résolu pour iOS 7 et 8:
Dans iOS 8, iOS encapsule silencieusement la vue souhaitée dans le popover dans le presentViewController du contrôleur de vue PresentViewController. Il y a une vidéo de la WWDC 2014 expliquant ce qui est nouveau avec le popovercontroller où ils abordent cela.
Quoi qu'il en soit, pour les contrôleurs de vue présentés sur la pile de contrôleurs de navigation qui veulent tous leur propre dimensionnement, ces contrôleurs de vue doivent (sous iOS 8) appeler ce code pour définir dynamiquement le PreferredContentSize:
Remplacez heightOfTable par votre table calculée ou la hauteur de vue.
Afin d'éviter beaucoup de code en double et de créer une solution commune iOS 7 et iOS 8, j'ai créé une catégorie sur UITableViewController pour effectuer ce travail lorsque viewDidAppear est appelé dans mes vues de table:
Category.h:
Catégorie.m:
la source
presentingViewController
œuvres. Si je place lepreferredContentSize
dans,viewDidLoad
il y a un comportement étrange: revenir en arrière à partir d'un autre contrôleur de vue dans le popover conduit à un changement de taille de popover incorrect. Il semble qu'une taille de popover de zéro a été définie, mais la taille est correcte. Dans un tel cas, le popover prend toute la hauteur de l'écran. Savez-vous peut-être pourquoi c'est le cas? Je n'ai pas la restriction avec 600 points implémentée car d'après mon expérience, le système d'exploitation ne vous permet pas de spécifier une taille supérieure à la taille de l'écran.viewDidLoad
...C'est une amélioration de la réponse de Krasnyk .
Votre solution est excellente, mais elle n'est pas correctement animée.
Une petite amélioration donne une belle animation:
Supprimez la dernière ligne de la
- (void) forcePopoverSize
méthode:Mettez [self forcePopoverSize] dans la
- (void)viewWillAppear:(BOOL)animated
méthode:Et enfin - définissez la taille souhaitée dans la
- (void)viewDidAppear:(BOOL)animated
méthode:la source
Vous devez redéfinir la taille du contenu dans
viewWillAppear
. En appelant la méthode delagate dans laquelle vous définissez la taille de popovercontroller. J'ai également eu le même problème. Mais quand j'ai ajouté cela, le problème a été résolu.Une dernière chose: si vous utilisez des versions bêta inférieures à 5. Alors les popovers sont plus difficiles à gérer. Ils semblent plus conviviaux à partir de la version bêta 5. C'est bien que la version finale soit sortie. ;)J'espère que cela t'aides.
la source
viewWillAppear
n'a pas fonctionné pour moi. Définir explicitement la taille du popover a fonctionné, mais c'est ghetto.Dans le
-(void)viewDidLoad
de tous les contrôleurs de vue que vous utilisez dans le contrôleur de navigation, ajoutez:la source
J'ai réinitialisé la taille dans la méthode animée viewWillDisappear: (BOOL) du contrôleur de vue qui est en cours de navigation depuis:
Ensuite, lorsque la vue sur laquelle vous revenez apparaît, je réinitialise la taille de manière appropriée:
la source
Pour iOS 8, les travaux suivants:
BTW je pense que cela devrait être compatible avec les versions précédentes d'iOS ...
la source
willTransitionToTraitCollection
, dans leanimateAlongsideTransition
bloc de complétion.la source
Pour moi, cette solution fonctionne. Ceci est une méthode de mon contrôleur de vue qui étend UITableViewController et est le contrôleur racine pour UINavigationController.
Et n'oubliez pas de définir la taille du contenu pour le contrôleur de vue que vous allez pousser dans la pile de navigation
la source
si vous pouvez imaginer l'assambler, je pense que c'est un peu mieux:
la source
CGSizeZero
place le faire par vous-même enCGSizeMake(0,0)
La réponse acceptée ne fonctionne pas correctement avec iOS 8. Ce que j'ai fait a été de créer ma propre sous-classe de
UINavigationController
pour l'utiliser dans cette popover et de remplacer la méthodepreferredContentSize
de cette manière:De plus, au lieu d'appeler
forcePopoverSize
(méthode implémentée par @krasnyk) dans,viewDidAppear
j'ai décidé de définir un viewController (qui montre popover) comme délégué pour la navigation précédemment mentionnée (dans popover) et de faire (ce que fait la méthode force) dans:déléguer une méthode pour un fichier
viewController
. Une chose importante, faireforcePopoverSize
dans uneUINavigationControllerDelegate
méthode est bien si vous n'avez pas besoin que cette animation soit fluide, alors laissez-laviewDidAppear
.la source
J'étais confronté au même problème, mais vous ne voulez pas définir la taille du contenu dans la méthode viewWillAppear ou viewWillDisappear.
définir la propriété contentSizeForViewInPopover pour ce contrôleur avant de pousser ce contrôleur vers navigationController
la source
J'ai eu de la chance en mettant ce qui suit dans le viewdidappear:
Bien que cela puisse ne pas s'animer correctement dans le cas où vous poussez / sautez des popovers de différentes tailles. Mais dans mon cas, fonctionne parfaitement!
la source
Tout ce que vous avez à faire est:
-Dans la méthode viewWillAppear du popOvers contentView, ajoutez l'extrait de code ci-dessous. Vous devrez spécifier la taille du popOver la première fois lors de son chargement.
la source
J'ai eu ce problème avec un contrôleur popover dont popoverContentSize = CGSizeMake (320, 600) au début, mais qui devenait plus grand lors de la navigation dans son ContentViewController (un UINavigationController).
Le contrôleur de navigation ne faisait que pousser et faire apparaître des UITableViewControllers personnalisés, donc dans viewDidLoad de ma classe de contrôleur de vue de table personnalisée, j'ai défini self.contentSizeForViewInPopover = CGSizeMake (320, 556)
Les 44 pixels de moins doivent tenir compte de la barre de navigation du contrôleur Nav, et maintenant je n'ai plus de problèmes.
la source
Mettez ceci dans tous les contrôleurs de vue que vous poussez à l'intérieur du popover
la source
J'ai rencontré le même problème et l'a résolu en définissant la taille de la vue du contenu sur le contrôleur de navigation et le contrôleur de vue avant que l'initialisation de UIPopoverController ne soit placée.
la source
J'aimerais simplement proposer une autre solution, car aucune de ces solutions n'a fonctionné pour moi ...
Je l'utilise en fait avec ce https://github.com/nicolaschengdev/WYPopoverController
Lorsque vous appelez votre popup pour la première fois, utilisez ceci.
Ensuite, dans cette fenêtre contextuelle, utilisez ceci.
Puis répétez pour les vues enfants ...
la source
C'est la manière correcte dans iOS7 de le faire, définissez la taille de contenu préférée dans viewDidLoad dans chaque contrôleur de vue dans la pile de navigation (une seule fois). Ensuite, dans viewWillAppear, obtenez une référence au contrôleur de popover et mettez à jour le contentSize à cet endroit.
la source
La solution @krasnyk fonctionnait bien dans les versions précédentes d'iOS mais ne fonctionnait pas sous iOS8. La solution suivante a fonctionné pour moi.
Ce n'est pas la meilleure solution, mais cela fonctionne.
Le nouveau UIPopoverPresentationController a également le problème de redimensionnement :(.
la source
Vous devez définir la
preferredContentSize
propriété de NavigationController dansviewWillAppear
:la source