10
votes

Comment se fait-il que certains de mes uiview sont décalés après la navigation?

Dans certaines de mes conceptions d'applications ou pour seulement quelques UIViews, à la suite d'une pushviewController de NavigationController, ma nouvelle vue sera décalée de la fenêtre par la hauteur de la barre d'état. En conséquence, je mettrai ce talon de code dans la méthode de la vue ViewDidLoad. XXX

Il n'a pas de sens pour moi que c'est l'intention de Xcode et de l'interface constructeur, alors je soupçonne que je suis faire quelque chose de fausse fondamentalement avec le SDK pendant ma conception de vue. En outre, sur une rare occasion que je n'ai pas à changer de vue, je ne sais vraiment pas quelle est la différence entre les deux approches de conception.

Note aussi, que la plupart du temps que j'essaie de Concevez mes vues à l'aide de l'IB, avec une personnalisation mineure.

Est-ce que quelqu'un d'autre se rencontre et sache ce qu'ils font pour corriger sans un tel talon de code?


1 commentaires

Notez également que j'ai joué avec le paramètre «Statut simulé» et au moins une fois, qui est apparu, faites le bon ajustement afin que je n'ai pas eu à modifier le code.


5 Réponses :


2
votes

La principale chose à garder à l'esprit est qu'un contrôleur d'affichage définira le cadre de sa vue elle-même. En effet, la quantité d'espace disponible pour la vue peut changer pendant la durée de vie de l'application, et seul le contrôleur d'affichage sait comment ajuster le cadre de la vue de manière appropriée. Des exemples de la quantité de changements d'espace incluent la hauteur de changement de barre de navigation, tournant l'appareil du portrait au paysage et la barre d'état peut également augmenter de hauteur si l'utilisateur prend un appel. À cause de cela, vous ne devez pas modifier vous-même le cadre de la vue.

Donc, la première chose que vous devez, c'est supprimer tout code en rapport avec la modification du cadre de la vue.

Vous devez maintenant concevoir vos vues avec la mentalité que la taille du cadre pourrait changer à tout moment. Cela signifie définir correctement la propriété automobilitaire de chaque sous-assisté. Si vous faites cela, cela ne comportera pas si vous allumez les barres de navigation et d'état simulées ou non; Ils sont juste là pour vous aider à voir ce que le résultat final ressemblera dans la plupart des cas.

Vous pouvez définir la propriété Autorésisatrice de chaque sous-évaluation dans l'interface Builder dans l'inspecteur de la taille (celle avec l'icône Règle). Dans l'animation, la boîte blanche représente la vue racine du contrôleur de vue, la case rouge représente la sous-vision actuellement sélectionnée. Vous remarquerez que la sous-vision est ancrée dans le coin supérieur gauche de la vue racine par défaut. C'est bien si la taille de la vue ne change jamais, mais nous savons que ne pas être vrai. Si vous avez des sous-visions que vous souhaitez apparaître au bas, ce que vous avez besoin, vous devez jouer avec le diagramme à gauche. La façon dont il fonctionne est si l'une des quatre lignes autour du bord est sélectionnée, la distance entre ce bord de la vue racine et le bord de la sous-vision est corrigée. Donc, si vous souhaitez qu'une Sous-site apparaisse en bas, vous devez vous assurer que la ligne la plus bas est sélectionnée et non le haut. Les deux lignes du milieu affectent si la taille de la sous-assistée change lorsque la vue Root View Change la taille. Ainsi, par exemple, si vous aviez une vue de table que vous vouliez occuper toute la hauteur de l'écran, vous vous assurez que la ligne verticale intérieure a été sélectionnée. Ceci s'appelle le modèle Struts and Springs.

Si vous ajoutez des sous-espions programmables, vous devez définir la propriété AutorésizedMask sur chaque sous-vision. Voici une explication .

espère que cela aide!


10 commentaires

Salut Moshy, je suppose que vous avez confirmé ce que je croyais (laissez le système gérer les vues et les cadres). Malheureusement, au fil du temps, quelque chose dans mon codage modifiera quelque chose et les cadres changent. Il est généralement la vue d'un contrôleur de visualisation sous-classée lorsque je navigue loin, puis revenez. Je suppose que ma compréhension est correcte et ma vraie question devrait être - comment puis-je déterminer ce que j'ai fait pour modifier ma hiérarchie et quel paramètre / paramètre fondamental dois-je corriger. J'ai également lu (plusieurs fois) le document référencé. Je ferai un peu plus d'avis avant que je décide que c'est la réponse.


Moshy, j'ai lu sur la question et les intervenants de Brian. Plusieurs d'entre eux ont constaté qu'ils doivent mettre le cadre à la taille de soi - ce que j'ai aussi fait. Cela ressemble à une condition de race de taille lors de la détection d'orientation ou de quelque chose de fondamental. Je vais vérifier mon autosization de mes sous-espions et si cela fonctionne, je vous attribuerai la réponse à vous.


HMM, cela pourrait vous aider si vous postez votre structure de contrôleur d'affichage. Les docs spécifient: lors du déploiement d'une interface de navigation, vous devez installer cette vue comme la racine de la hiérarchie de vue que vous créez. Par exemple, si vous déployez l'interface de navigation par lui-même, vous feriez cette vue la sous-vision principale de votre fenêtre. Pour installer une interface de navigation dans une interface de barre d'onglets, vous installeriez la vue du contrôleur de navigation comme vue racine de l'onglet approprié.


OK .. Dans l'une de mes principales applications, je vérifie 100% toutes les vues et les vues ajoutées avec AddSubViews et elles étaient toutes serties d'autosser. J'ai commenté certaines vues ésotériques. Avec tout cela, le problème persistait. Ce que j'ai trouvé, c'est que j'avais alloué une uoinavigationcontroller (pas encore «déployé», il n'est donc pas accroché à quoi que ce soit) et si je l'ai commenté, le problème est parti - mon écran n'a pas changé. Pour cette raison, je ne peux pas dire que votre suggestion a répondu mon problème (le contrôleur NAV n'était pas visible).


Les suggestions de Brian ne sont pas non plus les suggestions de Brian concernant l'utilisation de l'UITABController pour gérer en poussant la vue. J'ai ensuite travaillé avec IB et j'ai pu laisser IB Créer le contrôleur de navigation - défini comme une iboutlet dans mon programme, j'ai maintenant un contrôleur de navigation alloué et les vues sont toutes correctes. Je vais laisser cela sans réponse à moins que vous ne puissiez me donner une raison plausible de l'uoinavigationController.


BTW - Je dois souligner que je n'ai pas "corrigé" le problème de cette application avec la définition du cadre. J'ai d'autres applications dans lesquelles je vais appliquer votre principe et supprimer ces caractères.


Moshy, merci pour la réponse rapide. Je vais vérifier mon utilisation de votre contrôleur NAV et voir si je peux l'attacher à votre évaluation DOC. J'apprécie vraiment votre rupture minutieuse pour moi. 23 heures pour aller avant que la prime expire ... vous êtes proche :)


Y a-t-il un bon moyen de poster la structure car elle est plutôt impliquée et surtout dans IB.


Quelque chose de simple comme: UiWindow> UIVIVIGATIONCONTROLLER> {UIVIEWCONTROLLER, UIVIEWCONTROLLER} Ce que j'essaie de savoir si la vue du contrôleur de navigation est la vue racine de la fenêtre, car je pense que cela suppose que c'est même quand ce n'est pas le cas. Ensuite, peut-être qu'il pense qu'il doit compenser la vue pour accueillir la barre d'état, en réalité, son contrôleur de vue parent a déjà fait cela!


Je vais ajouter une autre réponse, car je pense que la solution est en réalité non liée à celle-ci.



1
votes

J'ai rencontré des problèmes similaires. Consultez mes deux questions précédentes:

iPhone - après Rejeter le contrôleur de vue modal - Gap reste en haut de la page

iPhone - UIView Addsubview Gap au sommet


2 commentaires

Bonjour Brian, comme je l'ai mentionné dans mes commentaires à Moshy (ci-dessus), j'ai examiné votre Q & A (que je pense avoir étudié avant de poser ma question) et ils semblaient prometteurs, mais ils n'ont pas répondu à mon problème. En outre, je pense que le réglage du cadre en soi est la mauvaise solution car quelque chose d'autre est plus probable. Je vais laisser le sans réponse aussi (j'ai répondu au problème de l'une de mes applications, mais je ne pense pas que ce soit la solution pour les autres applications).


Bonnes choses - Ces réponses ont été utiles pour ma R & D du problème et offrir une nouvelle idée du SDK, cependant, la réponse de Moshy a directement corrigé mon problème et avait des effets secondaires de nettoyage. Vous voudrez peut-être revisiter votre ancien problème et voir s'il s'agit de meilleures solutions. - Merci sincèrement pour vos efforts.



16
votes

J'ai utilisé code d'exemple de NAVBAR d'Apple pour essayer et reproduire ce problème.

L'applicationDidfinishLaunching est initialement implémentée comme ceci: xxx

si je le change à ceci: xxx

Puis je reçois l'écart apparaissant.

Cependant, si je ne fais que cela: xxx

alors tout a l'air normal.

Je suppose donc que chaque contrôleur d'affichage compensera sa vue si son contrôleur de vue racine. Mais le contrôleur de navigation remplace ce comportement pour compenser sa vue, qu'il s'agisse du contrôleur de vue de la racine. Par conséquent, je dirais que votre écart apparaît parce que vous avez un contrôleur de navigation quelque part plus bas dans la hiérarchie que ce qu'il est censé être.


3 commentaires

Je pense que vous êtes sur le problème. Je vais vérifier mon autre application qui a deux de ses écrans avec ce problème. Je pense que j'ai peut-être ajouté une uoinavigationController à ces UIViewControlers. De retour dans environ 20 minutes ...


Mystère résolu! C'est ça!!! J'apprécie vraiment votre diligence pour creuser dans ce domaine. J'ai appris un très bon principe pour ajouter une barre de navigation à UIViewControlers existante. La façon dont je les avais, ils ont été définis "plus bas dans la hiérarchie uiview"; Telle que lorsque je les ai ajoutés comme Iboutlet dans le code, instancié à IB et a accroché le contrôleur NAV de l'IB à l'iboutlet de mon code, j'ai eu la fois la fonctionnalité de navigation que je voulais et aucun des artefacts d'affichage. En outre, mon réglage de la trame a provoqué un "saut" dérangeant à revenir en place. C'est 110% la bonne réponse à mon problème.


J'ai remarqué que cela a été répondu en mars 10. Pas sûr si cela est compatible avec IOS6. J'ai un problème similaire, mais l'écart est inférieur à la barre de navigation. Voici ma question: Stackoverflow.com/questions/17790946/... merci.



0
votes

Link Texte

Un bug similaire est discuté ici.

aussi est l'animation définie sur non? Essayez de la définir sur Oui, car cela a résolu un problème similaire que je faisais face.


0 commentaires

0
votes

La réponse de Moshy était très utile car j'ai finalement réalisé la signification des lignes pointillées / solides dans IB pour contrôler les propriétés de redimensionnement des éléments UIView.

Cependant, l'ajustement de ces propriétés n'a pas abordé un problème similaire dans lequel je suis confronté à l'une de mes points de vue. Cette vue avait un statut et une barre supérieure définie dans IB. C'était un peu lourd, contenant un uiwebview qui chargerait une chaîne HTML dans ViewWillappear Code> et quelques autres éléments d'interface. p>

Lors du chargement de la vue, si l'utilisateur a soudainement modifié l'orientation de l'appareil de portrait à Paysage, tous les contenus de la vue changeraient vers le bas par la hauteur de la barre d'état. L'écart résultant entre les commandes de vue et son sommet resterait même après la retombée à l'orientation portrait. P>

Qu'est-ce qui a finalement résolu mes problèmes, et mes cheveux restants, ajoutaient la ligne: P>

-(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration


0 commentaires