web-dev-qa-db-fra.com

IOS7: décalage UIScrollView dans UINavigationController

Je suis en train de migrer mon application sur iOS 7 et je suis bloqué pendant des heures sur le nouveau gestionnaire de navigation/contrôleur.

Avant, lorsque nous avions un contrôleur de navigation, nous avions un extrait comme celui-ci:

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

Dans le constructeur d'interface, nous avions le choix de définir une barre de navigation existante pour la vue et tout correspond au contenu de la vue réelle.

OK alors maintenant, je n'ai aucune idée de la façon de concevoir correctement avec le constructeur d'interface. J'ai toujours mon extrait pour initialiser mon contrôleur de navigation. Cependant, dans le générateur d'interface de mon MainViewController, si je règle une barre d'état sur une barre de navigation translucide ou opaque, j'ai un décalage de 44px en haut (voir ci-dessous).


Interface Builder_________________________Et le résultat


Maintenant, si je règle aucune barre d'état, il n'y a pas de décalage en haut, mais comme la vue sur le simulateur est plus petite à cause de la barre de navigation, le bas de la vue dans le 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 Apple info dans le Guide de transition iOS7 à ce sujet.

Merci de votre aide


EDIT

Comme on peut 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 vue à défilement. Il apparaît également s'il s'agit d'une UITableView. Si une étiquette est en dehors de UIScrollView, il n'y a pas de décalage par rapport à cette étiquette.

126
streem

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

self.automaticallyAdjustsScrollViewInsets = false

Je ne comprends pas vraiment le véritable avantage de cette propriété cependant (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

286
streem

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!

enter image description here

92
Myxtic

Je rencontrais le même problème, mais j'ai trouvé une propriété plutôt étrange dans 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.

11
Ben Nicholas

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é toutes les autres réponses mais en vain, la seule chose qui a résolu mon problème est de changer la position de la table dans l'affichage des commandes du .xib

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

before

J'ai déplacé la tableView juste après la ImageView et cela a fonctionné:

after

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

P.D. Je n'utilise ni autoLayout ni les scénarimages

espérons que cela peut aider quelqu'un!

2
Chuy47

Avec automatiquementAdjustsScrollViewInsets défini sur YES (paramètre par défaut), le positionnement entre 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 storyboard/NIB.

2
dawid

Je suis aussi confronté à ce problème.

UIScrollView la taille du contenu est calculée par le système d'exploitation comme pour les autres tailles, les origines étant fournies par le système de contraintes - c'est pourquoi le système d'exploitation a des doutes.

Comment résoudre ce problème - Vous devez explicitement définir la taille du contenu de UIScrollView:

  1. Incorporer le contenu déroulant à UIView (je le renomme ContentView)
  2. Ajouter des contraintes:

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

enter image description here

1
maslovsa

Il semble qu'une solution de contournement consiste à afficher le fichier de scénario sous "iOS 6.1 et versions antérieures" (sélectionnez Fichier de scénario -> Inspecteur de fichiers -> Document Interface Builder -> Afficher en tant que. Le positionnement des sous-vues dans ce mode affiche le décalage.

0
swhitman

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

Je l'ai résolu en décochant Ajuster les incrustations de la vue de défilement et sous les barres du haut. Les deux sont situés dans l'inspecteur d'attributs du ViewController. Mille mercis!

0
Jackson Gan