J'ai beaucoup lu sur la transition de l'interface utilisateur iOS7.
Je ne suis pas en mesure d'obtenir ce que ces trois propriétés automaticallyAdjustsScrollViewInsets
, extendedLayoutIncludesOpaqueBars
, edgesForExtendedLayout
??
Par exemple, j'essaie de faire démarrer mes contrôleurs de vue sous la barre d'état, mais je ne suis pas en mesure d'y parvenir.
ios
objective-c
xcode
uiviewcontroller
ios7
user1010819
la source
la source
Réponses:
À partir d'iOS7, les contrôleurs de vue utilisent la disposition plein écran par défaut. Dans le même temps, vous avez plus de contrôle sur la façon dont il présente ses vues, et cela se fait avec ces propriétés:
bordsForExtendedLayout
Fondamentalement, avec cette propriété, vous définissez les côtés de votre vue qui peuvent être étendus pour couvrir tout l'écran. Imaginez que vous poussiez un
UIViewController
dans unUINavigationController
. Lorsque la vue de ce contrôleur de vue est disposée, elle commencera là où se termine la barre de navigation, mais cette propriété définira les côtés de la vue (haut, gauche, bas, droite) qui peuvent être étendus pour remplir tout l'écran.Voyons cela avec un exemple:
Ici, vous ne définissez pas la valeur de
edgesForExtendedLayout
, par conséquent, la valeur par défaut est prise (UIRectEdgeAll
), de sorte que la vue étend sa disposition pour remplir tout l'écran.Voici le résultat:
Comme vous pouvez le voir, l'arrière-plan rouge s'étend derrière la barre de navigation et la barre d'état.
Maintenant, vous allez définir cette valeur sur
UIRectEdgeNone
, vous dites donc au contrôleur de vue de ne pas étendre la vue pour couvrir l'écran:Et le résultat:
ajuste automatiquementScrollViewInsets
Cette propriété est utilisée lorsque votre vue est un
UIScrollView
ou similaire, comme unUITableView
. Vous voulez que votre tableau commence là où se termine la barre de navigation, car vous ne verrez pas tout le contenu sinon, mais en même temps, vous voulez que votre tableau couvre tout l'écran lors du défilement. Dans ce cas, le réglageedgesForExtendedLayout
sur Aucun ne fonctionnera pas, car votre table commencera à défiler à la fin de la barre de navigation et ne passera pas derrière.Voici où cette propriété est utile, si vous laissez le contrôleur de vue ajuster automatiquement les encarts (en définissant cette propriété sur YES, également la valeur par défaut), il ajoutera des encarts en haut du tableau, de sorte que le tableau commencera là où la navigation se termine, mais le défilement couvrira tout l'écran.
C'est quand est réglé sur NO:
Et OUI (par défaut):
Dans les deux cas, le tableau défile derrière la barre de navigation, mais dans le second cas (OUI), il commencera par le dessous de la barre de navigation.
extendedLayoutIncludesOpaqueBars
Cette valeur n'est qu'un ajout aux précédentes. Par défaut, ce paramètre est défini sur 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
àUIRectEdgeAll
).Si vous définissez la valeur sur OUI, cela permettra à la vue de passer à nouveau sous la barre d'état.
Si quelque chose n'est pas clair, écrivez un commentaire et j'y répondrai.
Comment iOS sait-il quel UIScrollView utiliser?
iOS récupère la première sous-vue de la vue de votre ViewController, celle de l'index 0, et s'il s'agit d'une sous-classe de,
UIScrollView
lui applique les propriétés expliquées.Bien sûr, cela signifie que cela
UITableViewController
fonctionne par défaut (puisqueUITableView
c'est la première vue).la source
Je ne sais pas si vous utilisez des storyboards, mais si vous l'êtes, pour que vos contrôleurs de vue commencent sous la barre d'état (et au-dessus de la barre inférieure):
Sélectionnez le contrôleur de vue dans IB, dans l'inspecteur d'attributs, désélectionnez «Étendre les bords - sous les barres supérieures» et «Étendre les bords - sous les barres inférieures».
la source
J'utilise des storyboards et les conseils ci-dessus ont fonctionné, mais je ne savais pas exactement comment le mettre en œuvre. Vous trouverez ci-dessous un bref exemple illustrant comment il a résolu le problème en plaçant la solution recommandée dans ViewController.
Mon problème: le réglage automatique défini sur true par défaut, entraînant une différence entre la conception du storyboard et le simulateur
Résolu: le code ci-dessus a été appliqué, désactivant le réglage automatique.
la source
J'ai résolu ce problème en ajoutant cette ligne, mais mon problème était lié à un
UIView
, pasUIScrollView
la source
Gardez à l'esprit que la
automaticallyAdjustsScrollViewInsets
propriété ne fonctionne que si une sorte de vue de défilement (vue de table, vue de collection, ...) est soitD'autres ont suggéré que cela fonctionne même s'il s'agit de la première sous-vue, mais il existe d'autres vues de défilement dans la hiérarchie des vues.
EDIT (extension DIY)
Si vous souhaitez un comportement similaire même si vous ne pouvez pas remplir ces conditions (par exemple, vous avez une image d'arrière-plan sous la vue de défilement), vous pouvez ajuster manuellement les incrustations de la vue de défilement. Mais s'il vous plaît ne le réglez pas sur constant comme 44 ou 64 ou même 20 comme beaucoup le suggèrent autour de SO. Vous ne pouvez jamais connaître la taille. Il peut y avoir la notification incall / gps / audio, la barre de navigation ne doit pas toujours être de 44 points, etc.
Je pense que la meilleure solution est d'utiliser layoutGuide
length
dans didLayoutSubviews:Vous pouvez utiliser le bottomLayoutGuide de la même manière.
la source