IOS7: décalage UIScrollView dans UINavigationController

Je suis actuellement en train de migrer mon application sur ios 7 et j’ai été bloqué pendant des heures sur la nouvelle gestion des contrôleurs / barres de navigation.

Auparavant, lorsque nous avions un contrôleur de navigation, nous avions un fragment comme celui-ci:

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

Dans le générateur d’interface, nous avons eu le choix de définir une barre de navigation existante pour la vue et tout correspond au contenu de la vue réelle.

OK maintenant, je n’ai aucune idée de la façon de concevoir correctement avec le générateur d’interface. J’ai toujours mon extrait pour initialiser mon navcontroller. Cependant, dans le générateur d’interface de MainViewController, si je mets une barre d’état sur une barre de navigation translucide ou opaque, le décalage est de 44px en haut (voir ci-dessous).

Interface Builder_________________________Et le résultat

Maintenant, si je définis la barre d’état sur none, il n’y a pas de décalage en haut mais comme la vue sur le simulateur est plus petite en raison de la barre de navigation, le bas de la vue du générateur d’interface est coupé.

Interface Builder_________________________Et le résultat

Je suppose que je manque vraiment quelque chose ici, mais je ne trouve aucun sujet ou info Apple dans iOS7 Transitions Guide à ce sujet.

Merci de votre aide

MODIFIER

Comme nous pouvons le voir sur les images, le premier enfant de la vue est un UIScrollView qui contient les deux étiquettes, le problème n’apparaît pas lorsqu’il n’y a pas de défilement. Il apparaît également si c’est un UITableView. Si une étiquette est en dehors de UIScrollView, cette étiquette n’est pas décalée.

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

 self.automaticallyAdjustsScrollViewInsets = false 

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

La seule documentation que j’ai trouvée était là:

Mettre à jour

Dans iOS 11, automaticallyAdjustsScrollViewInsets est obsolète

Vous devriez maintenant utiliser:

 self.tableView.contentInsetAdjustmentBehavior = .never 

Je vous encourage également à vérifier cette question et sa réponse pour mieux comprendre ces propriétés

La réponse de @ Justafinger a aussi bien fonctionné que moi.

Je voulais juste append que ce paramètre peut également être ajusté facilement à partir du générateur d’interface.

  1. Sélectionnez votre contrôleur de vue
  2. Cliquez sur l’onglet “Inspecteur des atsortingbuts”
  3. Décochez ‘Ajuster les encarts de défilement’
  4. Prendre plaisir!

entrer la description de l'image ici

Je me suis heurté à ce même problème, mais j’ai trouvé une propriété plutôt étrange sur ViewController dans le générateur d’interface qui semblait avoir causé cela pour moi. Il existe un ensemble de cases à cocher “Étendre les arêtes”. J’ai retiré le chèque «Under Top Bars» et tout a commencé à bien se dérouler pour moi.

Avec automaticAdjustsScrollViewInsets défini sur YES (le paramètre par défaut), il existe une incohérence dans le positionnement des vues de défilement entre ios6 et ios7. Par conséquent, pour les rendre cohérentes, vous devez désactiver ce paramètre. Toutefois, ios6 se bloque s’il rencontre automatiquement automatiquement AdjustsScrollViewInsets, vous devez donc soit modifier automatiquement le paramètre automaticAdjustsScrollViewInsets à la condition que ios7 soit activé, soit désactiver l’option en utilisant le storyboard / NIB.

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

ma solution était un peu bizarre, j’ai essayé toutes les autres réponses mais sans succès, la seule chose qui a résolu mon problème était de changer la position de tableView dans l’arborescence des contrôles du fichier .xib

c’était le premier contrôle dans la vue parent comme ceci:

avant

J’ai déplacé la tableView juste après l’ImageView et ça a fonctionné:

après

il semble que placer la vue de table dans la première position était à l’origine du problème, et déplacer la vue de table dans une autre position a résolu le problème.

PD Je n’utilise pas les storyboards autoLayout

J’espère que cela peut aider quelqu’un!

Je fais aussi face à ce problème.

UIScrollView taille du contenu UIScrollView est calculée par le système d’exploitation sous la forme d’autres tailles, origines fournies par le système de contraintes – c’est pourquoi le système d’exploitation a un doute.

Comment réparer – Vous devez définir explicitement la taille du contenu de UIScrollView :

  1. Intégrer un contenu déroulant à UIView (je le renomme en ContentView )
  2. Ajouter des contraintes:

ContentView.Weight = View.Weight et ContentView.Height = View.Height

entrer la description de l'image ici

Il semble qu’une solution de contournement consiste à afficher le fichier storyboard sous le nom “iOS 6.1 et versions antérieures” (sélectionnez le fichier storyboard-> Inspecteur de fichiers-> Document Interface Builder-> Afficher sous. Le positionnement des sous-vues dans ce mode indique le décalage.

Merci les gars pour les solutions! J’ai lutté pendant des heures pour essayer de résoudre le problème. Tout était ok quand il n’y avait pas de barre de navigation impliquée, mais ça a mal tourné au moment où j’ai intégré le ViewController dans un NavigationController.

Je l’ai résolu en décochant les encarts Ajuster l’affichage du défilement et les barres inférieures . Les deux sont situés dans l’inspecteur d’atsortingbuts de ViewController. Merci un million!