À partir d'iOS7, les contrôleurs de vue utilisent par défaut la disposition plein écran. En même temps, vous avez plus de contrôle sur la façon dont il dispose ses vues, et cela se fait avec ces propriétés :
edgesForExtendedLayout
En fait, cette propriété vous permet de définir les côtés de votre vue qui peuvent être étendus pour couvrir l'ensemble de l'écran. Imaginez que vous poussiez un UIViewController
en un UINavigationController
. Lorsque la vue de ce contrôleur de vue est mise en place, elle commence là où la barre de navigation se termine, mais cette propriété définit les côtés de la vue (haut, gauche, bas, droite) qui peuvent être étendus pour remplir tout l'écran.
Voyons cela à l'aide d'un exemple :
UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
Ici, vous ne définissez pas la valeur de edgesForExtendedLayout
par conséquent, la valeur par défaut est prise ( UIRectEdgeAll
), la vue étend donc sa mise en page pour remplir tout l'écran.
Voici le résultat :
Comme vous pouvez le voir, le fond rouge s'étend derrière la barre de navigation et la barre d'état.
Maintenant, vous allez régler cette valeur sur UIRectEdgeNone
Vous dites donc au contrôleur de la vue de ne pas étendre la vue pour couvrir l'écran :
UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
viewController.edgesForExtendedLayout = UIRectEdgeNone;
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
Et le résultat :
automaticallyAdjustsScrollViewInsets
Cette propriété est utilisée lorsque votre vue est un UIScrollView
ou similaire, comme un UITableView
. Vous voulez que votre tableau commence là où la barre de navigation se termine, car sinon vous ne verrez pas tout le contenu, mais en même temps vous voulez que votre tableau couvre tout l'écran lors du défilement. Dans ce cas, le paramètre edgesForExtendedLayout
à None ne fonctionnera pas car votre table commencera à défiler là où la barre de navigation se termine et ne passera pas derrière.
C'est ici que cette propriété est utile, si vous laissez le contrôleur de vue ajuster automatiquement les insertions (en donnant à cette propriété la valeur YES, qui est aussi la valeur par défaut), il ajoutera des insertions au sommet du tableau, de sorte que le tableau commencera là où la barre de navigation se termine, mais le défilement couvrira tout l'écran.
C'est quand il est réglé sur NON :
Et OUI (par défaut) :
Dans les deux cas, le tableau défile derrière la barre de navigation, mais dans le deuxième cas (OUI), il commencera à partir du dessous de la barre de navigation.
extendedLayoutIncludesOpaqueBars
Cette valeur ne fait que s'ajouter aux précédentes. Par défaut, ce paramètre a pour valeur NO. Si la barre d'état est opaque, les vues ne seront pas étendues pour inclure la barre d'état, même si vous étendez votre vue pour la couvrir ( edgesForExtendedLayout
a UIRectEdgeAll
).
Si vous donnez la valeur YES, cela permettra à la vue de repasser sous la barre d'état.
Si quelque chose n'est pas clair, écrivez un commentaire et je vous répondrai.
Comment iOS sait-il quel UIScrollView utiliser ?
iOS saisit la première sous-vue dans la vue de votre ViewController, celle qui se trouve à l'indice 0, et si c'est une sous-classe de UIScrollView
puis lui applique les propriétés expliquées.
Bien sûr, cela signifie que UITableViewController
fonctionne par défaut (puisque l UITableView
est la première vue).
5 votes
Et pourquoi pensez-vous que je ne l'ai pas lu ? Le problème, c'est que ça ne fonctionne pas comme prévu, c'est-à-dire que je n'ai pas bien compris ! Voilà la raison.
1 votes
Ohhh j'ai mal compris ce que tu disais là. Je n'essayais pas d'être condescendant, c'est juste que lorsque certaines personnes posent des questions comme celle-ci, et qu'elles sont nouvelles sur le site, elles passent à côté de solutions évidentes.
8 votes
Dans votre méthode viewDidLoad, ajoutez if([self respondsToSelector:@selector(edgesForExtendedLayout)]) self.edgesForExtendedLayout = UIRectEdgeNone ; ce qui forcera votre vue à démarrer sous la barre d'état.