Liste intégré dans le contrôleur de la navigation ne respecte pas la taille sur le dos de nav
J'ai un UIPopoverController l'hébergement d'un UINavigationController, qui contient une petite hiérarchie de vue des contrôleurs.
J'ai suivi la doc et pour chaque vue-contrôleur, j'ai mis l'affichage de la liste-la taille du contexte de la sorte:
[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];
(taille différente pour chaque contrôleur)
Cela fonctionne comme prévu, comme je l'ai naviguer vers l'avant dans la hiérarchie-- la liste automatiquement anime les changements de taille pour correspondre à la poussée du contrôleur.
Cependant, lorsque je navigue "Retour" à travers le point de vue de la pile via la barre de navigation bouton de Retour, la liste ne change pas de taille, il reste aussi grand que le plus profond de vue atteint. Cela semble cassé pour moi; je m'attends à la liste de respecter les tailles qui sont mis en place comme il apparaît à travers le point de vue de la pile.
Suis-je raté quelque chose?
Grâce.
- Où en êtes-vous de réglage de la taille de la liste? Êtes-vous le réinitialiser à chaque fois qu'une-vue-contrôleur est affiché (par exemple, dans
viewWillAppear:
)? - De quels documents avez-vous dire que vous avez suivies?
Vous devez vous connecter pour publier un commentaire.
Ok, j'ai été aux prises avec le même problème. Aucune des deux solutions n'a fonctionné pour moi très bien, c'est pourquoi j'ai décidé de faire un peu de recherche et de trouver comment cela fonctionne.
C'est ce que j'ai découvert:
- Lorsque vous définissez la
contentSizeForViewInPopover
dans votre vue-contrôleur, il ne sera pas modifié par la liste elle-même - même si liste de taille peut changer lors de la navigation à l'autre contrôleur.- Lorsque la taille de la liste va changer lors de la navigation vers les différents contrôleur, en remontant, la taille de la liste n'a pas de restauration
- Modification de la taille de la liste dans viewWillAppear donne de très étrange animation (quand vous disons que vous popController à l'intérieur de la liste) - je n'avais pas le recommander
- Pour moi, le réglage de la codé en dur de la taille à l'intérieur du contrôleur ne fonctionnerait pas du tout mon contrôleurs ont parfois de grandes parfois des petits - contrôleur qui va présenter l'idée à propos de la taille de l'
Une solution pour tous, que la douleur est comme suit:
Vous devez réinitialiser la taille de
currentSetSizeForPopover
dans viewDidAppear. Mais vous devez être prudent lorsque vous aurez mis la même taille comme cela a déjà été défini dans le champcurrentSetSizeForPopover
ensuite la liste ne changera pas la taille. Pour ce faire, vous pouvez tout d'abord définir le faux taille (qui sera différent de celui qui a été mis en avant) suivie par la mise à la bonne taille. Cette solution fonctionne même si votre contrôleur est imbriquée à l'intérieur de la manette de navigation et la liste va changer sa taille en conséquence, lorsque vous naviguez entre les contrôleurs.Vous pouvez facilement créer une catégorie sur UIViewController avec la suite de la méthode d'assistance que ferait l'affaire avec réglage de la taille:
Puis il suffit de l'invoquer dans
-viewDidAppear
de contrôleur désiré.Voici comment je l'ai résolu pour iOS 7 et 8:
Dans iOS 8, iOS est en silence enveloppant la vue que vous souhaitez dans la liste dans le presentedViewController de la presentingViewController-vue-contrôleur. Il y a de la WWDC 2014 vidéo expliquant ce qui est nouveau avec le popovercontroller où ils se touchent sur ce.
De toute façon, pour afficher les contrôleurs présenté sur la manette de navigation pile qui veulent tous leur propre dimensionnement, ces vue contrôleurs de besoin (sous iOS 8) appeler ce code pour définir dynamiquement les preferredContentSize:
Remplacer heightOfTable avec votre calculée de la table ou de la vue en hauteur.
Afin d'éviter beaucoup de code en double et de créer un iOS 7 et iOS 8 solution, j'ai créé une catégorie sur UITableViewController pour effectuer ce travail lorsque viewDidAppear est appelé dans mon tableviews:
Catégorie.h:
Catégorie.m:
presentingViewController
œuvres. Si j'ai mis lepreferredContentSize
dansviewDidLoad
il y a un comportement étrange: Naviguer de nouveau à partir d'un autre point de vue contrôleur dans la liste aboutit à une fausse liste de changement de taille. Il apparaît comme une liste de taille de zéro a été établi, mais la taille est correcte. Dans un tel cas, la liste 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 mis en œuvre parce que, dans mon expérience, le système d'exploitation ne permet pas de spécifier une taille supérieure à la taille de l'écran.viewDidLoad
...C'est une amélioration sur krasnyk's réponse.
Votre solution est grande, mais il n'est pas très bien animés.
Un peu d'amélioration donne belle animation:
Supprimer la dernière ligne dans le
- (void) forcePopoverSize
méthode:Mettre [auto forcePopoverSize] dans
- (void)viewWillAppear:(BOOL)animated
méthode:Et enfin - pour définir la taille désirée dans
- (void)viewDidAppear:(BOOL)animated
méthode:Vous devez définir la taille du contenu à nouveau dans
viewWillAppear
. En appelant le delagate méthode dans laquelle vous définissez la taille de popovercontroller. J'ai eu également le même problème. Mais quand j'ai ajouté ce que le problème est résolu.encore Une chose: si vous utilisez des versions bêta inférieur à 5. Puis les popovers sont plus difficiles à gérer. Ils semblent être plus respectueux de la version bêta 5. Il est bon que la version finale est sortie. 😉Espère que cette aide.
viewWillAppear
ne fonctionne pas pour moi. Réglage de la liste de la taille explicitement fait un travail, mais que du ghetto.Dans le
-(void)viewDidLoad
de tous les contrôleurs de vue que vous utilisez dans la manette de navigation, ajouter:Je réinitialiser la taille de la viewWillDisappear:(BOOL)animé méthode de la vue-contrôleur qui navigue en arrière à partir de:
Puis, quand la vue de naviguer en arrière apparaît, je réinitialiser la taille appropriée:
Pour iOS 8, les travaux suivants:
BTW, je pense que, cela devrait être compatible avec les précédentes versions iOS...
willTransitionToTraitCollection
, dansanimateAlongsideTransition
achèvement bloc.Pour moi, c'solutions fonctionne.
C'est une méthode de mon point de vue contrôleur qui s'étend UITableViewController et il est la racine contrôleur pour UINavigationController.
Et n'oubliez pas de régler la taille du contenu de vue-contrôleur va vous pousser à une pile de navigation
si vous pouvez imaginer le assambler, je pense que c'est un peu mieux:
CGSizeZero
au lieu de décisions par vous-même enCGSizeMake(0,0)
La accepté de répondre à ne fonctionne pas très bien avec iOS 8. Ce que j'ai fait était de créer mon propre sous-classe de
UINavigationController
pour les utiliser dans la liste et de redéfinir la méthodepreferredContentSize
de cette façon:En outre, au lieu d'appeler
forcePopoverSize
(méthode mise en œuvre par @krasnyk) dansviewDidAppear
j'ai décidé de mettre un viewController (qui montre la liste) en tant que délégué pour mentionné précédemment navigation (en liste) et le faire (ce que la force de la méthode ne) en:délégué méthode pour un passé
viewController
. Une chose importante, faireforcePopoverSize
dans unUINavigationControllerDelegate
méthode est très bien si vous n'avez pas besoin que l'animation soit lisse, si oui, alors ne la laissez dansviewDidAppear
.J'étais face à un même problème, mais vous ne souhaitez pas définir contentsize dans viewWillAppear ou viewWillDisappear méthode.
ensemble contentSizeForViewInPopover de la propriété pour que le contrôleur avant d'appuyer sur le contrôleur pour navigationController
J'ai eu la chance de mettre la suite dans le viewdidappear:
Même si cela peut ne pas animer joliment dans le cas où vous êtes poussant/popping de taille différente popovers. Mais dans mon cas, fonctionne parfaitement!
Tout ce que vous avez à faire est de:
-Dans le viewWillAppear méthode de la popOvers contentView, ajouter l'extrait donné ci-dessous. Vous devrez spécifier la liste taille de la première fois quand il est chargé.
J'ai eu ce problème avec une liste contrôleur dont popoverContentSize = CGSizeMake(320, 600) au début, mais permettrait d'obtenir de plus grandes lorsque vous naviguez à travers ses ContentViewController (un UINavigationController).
La valeur liquidative contrôleur était que de pousser et de popping personnalisé UITableViewControllers, donc dans mon tableau personnalisé-vue-contrôleur de la classe viewDidLoad j'ai mis l'auto.contentSizeForViewInPopover = CGSizeMake(320, 556)
44 moins de pixels pour tenir compte de la valeur liquidative du contrôleur de la barre de navigation, et maintenant je n'ai pas de questions plus.
Mettre cela dans tous les contrôleurs de vue vous sont en train de pousser à l'intérieur de la liste
Confronté à la même question, et fixe par réglage de l'affichage du contenu de la taille de manette de navigation et affichage de contrôleur avant l'initialisation de UIPopoverController a été placé.
Je voudrais juste proposer une autre solution, car aucun de ces fonctionné pour moi...
Je suis en train de l'utiliser avec ce https://github.com/nicolaschengdev/WYPopoverController
Lorsque vous appelez d'abord votre popup utilisation de ce.
Alors dans ce popup utilisation de ce.
Puis répétez l'opération pour les vues enfant...
C'est la façon correcte dans iOS7 pour ce faire,
Configurer le choix de la taille du contenu dans le viewDidLoad dans chaque vue contrôleur dans la pile de navigation (seulement une fois). Puis dans viewWillAppear obtenir une référence à la liste de contrôleur et de mise à jour de la contentSize là.
@krasnyk solution a bien fonctionné dans les précédentes versions iOS, mais ne fonctionne pas dans iOS8. La solution suivante a fonctionné pour moi.
Ce n'est pas la meilleure solution, mais il fonctionne.
La nouvelle UIPopoverPresentationController a aussi le problème de redimensionnement 🙁 .
Vous devez définir la
preferredContentSize
propriété de la NavigationController dansviewWillAppear
: