Question La barre d'état et la barre de navigation apparaissent sur les limites de ma vue dans iOS 7


J'ai récemment téléchargé Xcode 5 DP pour tester mes applications dans iOS 7. La première chose que j'ai remarquée et confirmée est que les limites de ma vue ne sont pas toujours redimensionnées pour tenir compte de la barre d'état et de la barre de navigation.

Dans viewDidLayoutSubviews, J'imprime les limites de la vue:

{{0, 0}, {320, 568}}

Cela entraîne l'affichage de mon contenu sous la barre de navigation et la barre d'état.

Je sais que je pourrais moi-même expliquer la hauteur en obtenant la hauteur de l'écran principal, en soustrayant la hauteur de la barre d'état et la hauteur de la barre de navigation, mais cela semble être un travail supplémentaire inutile.

Comment puis-je résoudre ce problème?

Mettre à jour:

J'ai trouvé une solution pour ce problème spécifique. Définissez la propriété translucide de la barre de navigation sur NO:

self.navigationController.navigationBar.translucent = NO;

Cela corrigera la vue d'être encadré sous la barre de navigation et la barre d'état.

Cependant, je n'ai pas trouvé de correctif pour le cas où vous souhaitez que la barre de navigation soit translucide. Par exemple, en regardant une photo en plein écran, je souhaite que la barre de navigation soit translucide, et que la vue soit encadrée en dessous. Cela fonctionne, mais quand je bascule en montrant / cachant la barre de navigation, j'ai eu des résultats encore plus étranges. La première sous-vue (un UIScrollView) a ses limites d'origine modifiées à chaque fois.


419
2018-06-12 20:06


origine


Réponses:


Vous pouvez y parvenir en implémentant une nouvelle propriété appelée edgesForExtendedLayout dans iOS7 SDK. Veuillez ajouter le code suivant pour cela,

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

Vous devez ajouter ce qui précède dans votre -(void)viewDidLoad méthode.

iOS 7 apporte plusieurs modifications à la mise en page et à la personnalisation du   apparence de votre UI. Les modifications apportées à la disposition du contrôleur de vue, à la teinte   la couleur, et la police affectent tous les UIKit objets dans votre application. Dans   De plus, les améliorations apportées aux API de reconnaissance de gestes   contrôle granulaire des interactions gestuelles.

Utilisation de View Controllers

Dans iOS 7, les contrôleurs de vue utilisent une disposition en plein écran. En même temps,   iOS 7 vous donne un contrôle plus granulaire sur la façon dont un contrôleur de vue   expose ses points de vue. En particulier, le concept de mise en page plein écran   a été affiné pour permettre à un contrôleur de vue de spécifier la disposition de chaque   bord de sa vue.

le wantsFullScreenLayout la propriété du contrôleur de vue est déconseillée dans   iOS 7. Si vous spécifiez actuellement wantsFullScreenLayout = NO, la vue   le contrôleur peut afficher son contenu à un emplacement d'écran inattendu   quand il fonctionne sous iOS 7.

Pour ajuster la façon dont un contrôleur de vue dispose ses vues, UIViewController   fournit les propriétés suivantes:

  • edgeForExtendedLayout

le edgesForExtendedLayout la propriété utilise le UIRectEdge type,   qui spécifie chacun des quatre bords d'un rectangle, en plus de   ne spécifiant aucun et tous. Utilisation edgesForExtendedLayout pour spécifier   les bords d'une vue doivent être étendus, quelle que soit la translucidité de la barre. Par   par défaut, la valeur de cette propriété est UIRectEdgeAll.

  • extendedLayoutIncludesOpaqueBars

Si votre conception utilise des barres opaques, affinez edgesForExtendedLayout par   également la mise en extendedLayoutIncludesOpaqueBars propriété à    NON. (La valeur par défaut de extendedLayoutIncludesOpaqueBars est NON.)

  • automaticAdjustsScrollViewInsets

Si vous ne souhaitez pas que les encarts de contenu d'une vue de défilement soient automatiquement   ajusté, ensemble automaticallyAdjustsScrollViewInsets à NON. (Le   valeur par défaut de automaticallyAdjustsScrollViewInsets est OUI.)

  • topLayoutGuide, bottomLayoutGuide

le topLayoutGuide et bottomLayoutGuide les propriétés indiquent le   l'emplacement des bords de la barre supérieure ou inférieure dans la vue d'un contrôleur de vue.   Si les barres doivent chevaucher le haut ou le bas d'une vue, vous pouvez utiliser   Interface Builder pour positionner la vue par rapport à la barre en créant   contraintes au fond de topLayoutGuide ou au sommet de   bottomLayoutGuide. (Si aucune barre ne doit chevaucher la vue, le bas de    topLayoutGuide est le même que le haut de la vue et le haut de la    bottomLayoutGuide est le même que le bas de la vue.) Les deux   les propriétés sont créées paresseusement à la demande.

Se il vous plaît se référer, apple doc


491
2017-09-13 11:52



Vous n'avez pas à calculer jusqu'où vous pouvez tout décaler, il y a une propriété de construction pour cela. Dans Interface Builder, mettez votre contrôleur de vue en surbrillance, puis accédez à l'inspecteur d'attributs. Ici, vous verrez des cases à cocher à côté des mots "Extend Edges". Comme vous pouvez le voir, dans la première capture d'écran, la sélection par défaut est que le contenu apparaisse sous les barres du haut et du bas, mais pas sous les barres opaques, ce qui explique pourquoi le style non translucide a fonctionné pour vous.

Comme vous pouvez le voir dans la première capture d'écran, deux éléments de l'interface utilisateur se cachent sous la barre de navigation. (J'ai activé les wireframes dans IB pour illustrer ceci) Ces éléments, un UIButton et un UISegmentedControl ont tous deux leur origine "y" à zéro, et le contrôleur de vue est configuré pour autoriser le contenu sous la barre supérieure.

enter image description here

Cette deuxième capture d'écran montre ce qui se passe lorsque vous désélectionnez la case à cocher "Under Top Bars". Comme vous pouvez le voir, la vue des contrôleurs de vue a été décalée de manière appropriée pour que son origine soit juste en dessous de la barre de navigation.

enter image description here

Cela peut également être accompli par programmation via l'utilisation de -[UIViewController edgesForExtendedLayout]. Voici un lien vers la référence de classe pour edgeForExtendedLayout, et pour UIRectEdge

[self setEdgesForExtendedLayout:UIRectEdgeNone];

109
2017-09-13 11:56



J'ai créé ma vue par programmation et cela a fini par fonctionner pour moi:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

La source (dans topLayoutGuide section au bas de la page 39).


33
2017-09-24 08:35



Solution Swift 3 / Swift 4 qui fonctionne également avec les fichiers NIB / XIB dans iOS 10+:

override func viewDidLoad() {
    super.viewDidLoad()

    edgesForExtendedLayout = []
}

20
2017-09-01 20:17



Si vous voulez que la barre de navigation soit translucide (ce qui est plutôt sympa), vous devez configurer un ContentInset ou similaire.

Voici comment je le fais:

// Check if we are running on ios7
if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
      CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
      float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;

      myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
}

10
2017-09-13 09:16



edgesForExtendedLayout fait l'affaire pour iOS 7. Cependant, si vous construisez l'application à travers iOS 7 SDK et le déployer dans iOS 6, la barre de navigation apparaît translucide et les vues vont dessous. Donc, pour le résoudre à la fois pour iOS 7 ainsi que pour iOS 6, procédez comme suit:

self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

9
2017-09-21 05:18



Dans votre fichier plist d'applications, ajoutez une ligne, appelez-la "Afficher l'apparence de la barre d'état basée sur le contrôleur" et réglez-la sur NON.


9
2017-09-19 13:45



Le truc le plus simple est d'ouvrir le PLUME fichier et faites ces deux étapes simples:

  1. Changez juste cela et réglez-le sur celui que vous préférez:

Enter image description here

  1. Sélectionnez les UIView / UIIMageView / ... que vous souhaitez déplacer vers le bas. Dans mon cas, seul le logo était superposé et j'ai défini le delta à +15; (OU -15 si vous avez choisi iOS 7 à l'étape 1)

Enter image description here

Et le résultat:

Before After


7
2017-09-20 10:27