2013-10-11 1 views
4

J'utilise les transitions personnalisées iOS7 pour présenter de manière modulaire un nouveau contrôleur de vue.iOS7 Transitions personnalisées avec UINavigationController

Le nouveau contrôleur de vue est un contrôleur de navigation.

L'automate s'anime à partir du bas, tandis que l'arrière-plan est flou. Mon problème est que la barre de navigation sur le nouveau contrôleur, tout en animant vers le haut, semble permettre une barre d'état, c'est à dire qu'il semble être 64 points de haut. Quand il a atteint son emplacement final et appelé completeTransition, il réalise qu'aucun espace de barre d'état n'est requis et revient à 44 points.

est-il un moyen de

  • Initialement informer le contrôleur de navigation/haut contrôleur de vue qu'aucune barre d'état est nécessaire. OU
  • Appelez n'importe quelle méthode que completeTransition appelle avant l'animation afin que le réajustement automatique ait lieu alors.

lors de l'animation:

While animating

Animation complète:

Animation complete

Répondre

7

L'astuce est d'ajouter la vue du contrôleur de vue présenté à la vue du récipient après réglage de son premier positionnez-vous au bas de l'écran. Cela empêche la vue du conteneur de penser qu'il est en haut de l'écran et de disposer automatiquement la disposition de la barre d'état en conséquence.

Il est lié à ce qui suit de WRESTLING WITH STATUS BARS AND NAVIGATION BARS ON IOS 7:

« UINavigationController modifiera la hauteur de son UINavigationBar soit à 44 points ou 64 points, selon un ensemble assez étrange et non documentée de contraintes Si le UINavigationController détecte. le haut du cadre de sa vue est visuellement contigu avec le haut de son UIWindow, puis il dessine sa barre de navigation avec une hauteur de 64 points.Si le sommet de sa vue n'est pas contigu au sommet de l'UIWindow (même s'il est éteint par un seul point), dessine sa barre de navigation de manière "traditionnelle" avec une hauteur de 44 points.Cette logique est exécutée par UINavigationController même s'il y a plusieurs enfants dans la hiérarchie du contrôleur de vue de votre application. s aucun moyen d'empêcher ce comportement. "

+0

Cela semble si évident maintenant ... – maxhs

0

Alan, puisque vous n'avez pas répondu à votre question, je la mets en place pour que les autres puissent la trouver. J'ai rencontré une situation similaire et votre solution ne fonctionnerait pas dans mon cas, donc cette solution plus générale peut être plus utile.

ici Navigation bar has wrong position when modal a view controller with flip horizontal transition in iOS 7 trouvé

Une solution rapide est de mettre:

[self.navigationController.navigationBar.layer removeAllAnimations];  

Dans le viewWillAppear de la vue que vous la transition vers. Cela évite d'avoir à placer votre vue sous l'écran avant de l'animer.

Comme vous l'avez souligné plus haut, le contrôleur UINavigationController détermine sa taille à un moment donné et cela est en conflit avec l'animation.

0

J'ai rencontré des problèmes similaires avec UINavigationBar. Dans un cas, il s'agissait d'un splitview personnalisé (nous ne pouvons pas utiliser UIKit parce qu'il manque certaines fonctionnalités dans iOS 5.0) et aussi avec un UINavigationController dont la vue a été ajoutée dans une autre vue.

L'utilisation de la hiérarchie de contrôleurs a beaucoup aidé ici, il semble qu'IOS accorde également une certaine attention à cela lors du choix de la disposition de UINavigationBar. J'ai été capable d'avoir un UINavigationController avec la hauteur correcte définie par le système d'exploitation sans avoir UINavigationBar contigu avec le sommet de son UIWindow, donc c'est possible.

Il y avait cependant un problème, lorsque la vue est apparue pour la première fois, elle avait la hauteur incorrecte et ensuite automatiquement augmenté pour avoir la bonne hauteur de 64 pixels tout seul.

La solution pour obtenir la vue avec la hauteur correcte dès le départ était de définir la vue avec toute la largeur de l'écran, puis d'utiliser la méthode [UIViewController viewDidLayoutSubviews] pour définir le cadre de la vue avec la largeur I voulait. Cela signifiait que le contrôleur faisait la disposition de l'UINavigationBar comme je le souhaitais et que je corrigerais l'image de la vue et que cela ne changerait pas la hauteur de l'UINavigationBar.

Pour la situation spécifique de l'OP présenté, vous pouvez faire le contraire. Définissez d'abord la vue avec la moitié de la largeur de sorte que la barre soit petite au début, puis modifiez la largeur en fonction de ce que vous voulez. J'ai testé cela dans une autre situation et cela a également fonctionné, mais il n'y avait pas d'animation, ce qui peut tuer ma solution. Je recommande de changer la largeur et la position x.

Ceci est un hack terrible, donc si quelqu'un propose une solution qui me permettra de supprimer ce code, faire partager.

Questions connexes