Question

Dans certains de mes dessins d'application ou pour seulement quelques UIViews, à la suite d'un pushViewController NavigationController, ma nouvelle vue sera transféré hors fenêtre par la hauteur de la barre d'état. En conséquence, je vais mettre ce bout de code dans la méthode viewDidLoad.

CGRect  frameAt = [self.view frame];
CGRect  statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
frameAt.origin.y += statusBarFrame.size.height;
[self.view setFrame: frameAt];

Il ne fait pas sens pour moi que ce soit l'intention de XCode et Interface Builder, donc je suppose que je suis en train de faire quelque chose de fondamentalement mauvais avec le SDK lors de ma conception de la vue. De plus, à l'occasion rare que je ne dois pas changer mon point de vue, je ne sais vraiment pas ce que la différence entre les deux approches de conception.

Notez également que la plupart du temps, je tente de concevoir mon point de vue en utilisant IB, avec une certaine personnalisation mineure.

Quelqu'un d'autre courir sur cette question et savent ce qu'ils font pour fixer sans un tel talon de code?

Était-ce utile?

La solution

Je l'ai utilisé code exemple NavBar d'Apple pour essayer et reproduire ce problème.

le applicationDidFinishLaunching est à l'origine mis en œuvre comme ceci:

[window addSubview:navigationController.view];
[window makeKeyAndVisible];

Si je change à ceci:

UIViewController *shellController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[shellController.view addSubview:navigationController.view];
[window addSubview:shellController.view];
[window makeKeyAndVisible];

Puis-je obtenir l'écart qui apparaît.

Cependant, si je ne fais que ceci:

UIView *shell = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[shell addSubview:navigationController.view];
[window addSubview:shell];
[window makeKeyAndVisible];

Ensuite, tout semble normal.

Je suppose que chaque contrôleur de vue compensera son point de vue si son contrôleur de vue racine. Mais le contrôleur de navigation remplace ce comportement pour compenser son point de vue, peu importe que ce soit le contrôleur de vue 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 qu'il est censé être.

Autres conseils

La principale chose à garder à l'esprit est ici qu'un contrôleur de vue définira le cadre de son point de vue elle-même. En effet, la quantité d'espace disponible à la vue peut changer au cours de la durée de vie de l'application, et seul le contrôleur de vue sait comment ajuster correctement le cadre de la vue. Des exemples de lorsque la quantité de changements d'espace comprennent la hauteur variable barre de navigation, en tournant le dispositif du mode portrait au paysage et la barre d'état peut également augmenter en hauteur si l'utilisateur prend un appel. En raison de cela, vous ne devez pas modifier le cadre de la vue vous-même.

Alors, la première chose que vous devez est est enlever tout le code lié à la structure de Sa modification de la vue.

Maintenant, vous devez concevoir votre point de vue avec l'état d'esprit que la taille de l'image peut changer à tout moment. Cela signifie définir la propriété de chaque sous-vue d'un redimensionnement automatique correctement. Si vous faites cela, alors il ne sera pas question si vous activez la navigation simulées et des barres d'état 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é Autoresizing de chaque sous-vue dans Interface Builder dans l'inspecteur de taille (celui avec l'icône de la règle). Dans l'animation, la boîte blanche représente la vue racine du contrôleur de vue, la boîte rouge représente la sous-vue actuellement sélectionné. Vous remarquerez que la sous-vue est ancré dans le coin supérieur gauche de la vue racine par défaut. Ceci est très bien si la taille de la vue ne change jamais, mais nous savons que ne pas être vrai. Si vous avez des vues secondaires que vous souhaitez voir apparaître au fond sans terre-ce, alors vous devez jouer avec le diagramme à gauche. Le fonctionnement est si l'une des quatre lignes autour du bord est sélectionné, alors la distance entre le bord de la vue racine et le bord de la sous-vue est fixe. Donc, si vous voulez un sous-vue apparaisse en bas, vous devez vous assurer que la partie la plus basse ligne est sélectionnée et non en haut. Les deux lignes au milieu affectent si la taille du sous-vue change quand la taille vue chroot. Ainsi, par exemple, si vous aviez une vue de table que vous vouliez occuper toute la hauteur de l'écran, vous assurez-vous que la ligne verticale intérieure a été sélectionnée. On appelle cela le modèle des entretoises et ressorts.

Si vous ajoutez subviews vous devez programatically définir la propriété autoresizingMask sur chaque sous-vue. Voici un explication.

L'espoir qui aide!

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

iPhone - Après rejetant contrôleur Modal View - écart reste en haut de la page

iPhone - UIView addSubview Gap en haut

scroll top