126 votes

IOS7: décalage UIScrollView dans UINavigationController

Je suis en train de migrer mon application sur ios 7 et j'ai été coincé pendant des heures sur la nouvelle navigationcontroller/barre de direction.

Avant, quand nous avons eu une manette de navigation, nous avons eu un extrait de code comme ceci :

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

Dans interface builder, nous avions le choix de définir un existant navigationbar pour la vue et tout ce qui corresponde au contenu de la vue réelle.

OK, donc maintenant, je n'ai aucune idée de la façon de concevoir correctement avec interface builder. J'ai toujours mon extrait de code pour initialiser mon navcontroller. Toutefois, dans interface builder pour mon MainViewController si j'ai mis une barre de statut translucide ou opaque barre de navigation, j'ai un décalage de 44px en haut (voir ci-dessous).


Interface Builder_________________________Et le résultat

2yx55xf.png1qjrwm.png


Maintenant, si je mets la barre d'état pour aucun, il n'y a pas de décalage au début, mais depuis le point de vue sur simulateur est plus petit en raison de la barre de navigation en bas de la vue dans interface builder est coupée.

Interface Builder_________________________Et le résultat

2054e2c.png28i47c5.png

Je suppose que je suis vraiment en manque de quelque chose ici, mais je ne peux pas trouver n'importe quel sujet ou apple info dans iOS7 Transitions Guide à ce sujet.

Merci pour votre aide


MODIFIER

Comme nous pouvons le voir dans les images, le premier enfant de la vue est un UIScrollView qui contient à la fois des étiquettes, le problème n'apparaît pas quand il n'y a pas de scrollview. Il apparaît également si c'est une UITableView. Si une étiquette est à l'extérieur de la UIScrollView, il n'y a pas de décalage à l'étiquette.

286voto

Justafinger Points 3409

OK, donc j'ai trouvé la solution, j'ai mis dans mon contrôleur de la propriété :

self.automaticallyAdjustsScrollViewInsets = NO;

Je ne comprends pas vraiment le véritable avantage de cette propriété que, (ou pourquoi la valeur par défaut est OUI)

La seule documentation que j'ai trouvé était là : https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html

92voto

Myxtic Points 889

La réponse de @ Justafinger a également fonctionné à merveille.

Je voulais juste ajouter que ce paramètre peut également être ajusté facilement à partir du constructeur d'interface.

  1. Sélectionnez votre contrôleur de vue
  2. Cliquez sur l'onglet "Inspecteur d'attributs".
  3. Décocher 'Ajuster les incrustations d'affichage de défilement'
  4. Prendre plaisir!

entrez la description de l'image ici

11voto

Ben Nicholas Points 21

Je rencontrais le même problème, mais j'ai trouvé une propriété plutôt étrange sur le ViewController dans le générateur d'interface qui semble l'avoir provoquée pour moi. Il existe un ensemble de cases à cocher "Etendre les bords". J'ai enlevé le chèque "Under Top Bars" et tout a commencé à bien se dérouler pour moi.

2voto

dawid Points 64

Avec automatiquementAdjustsScrollViewInsets défini sur YES (paramètre par défaut), le positionnement entre les vues de défilement entre ios6 et ios7 ne concorde pas. Par conséquent, pour les rendre cohérents, vous devez désactiver ce paramètre. Toutefois, ios6 se bloque s'il détecte automatiquement les ajustements d'AdjustsScrollViewInsets. Vous devez donc modifier automatiquement le programme d'AdjustsScrollViewInsets en fonction de ios7 ou désactiver l'option à l'aide du scénario / NIB.

2voto

Gerardo Medina Points 279

J'ai eu un problème similaire, après avoir rejeté un viewController, le contentOffset de mon tableView a été changé en (0, -64).

ma solution était un peu bizarre, j'ai essayé tous les autres réponses, mais n'avait pas de succès, la seule chose qui a résolu mon problème a été de passer la tableView position dans le contrôle de l'arbre de la .xib

il a été le premier contrôle de la Vue parent comme ceci:

before

J'ai déplacé le tableView juste après l'ImageView et il a travaillé:

after

il semble que le fait de mettre la table dans la première position a été à l'origine du problème, et le déplacement de la vue de la table à un autre poste fixe le problème.

P. D. je ne suis pas à l'aide de mise en page automatique ni les storyboards

j'espère que cela peut aider quelqu'un!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X