web-dev-qa-db-fra.com

La vue s'est cachée sous UINavigationBar iOS 7

Plus tôt, j'utilisais iOS 6.1 pour mon projet. Récemment, je suis passé à iOS 7. Pour, beaucoup de changements que je connaissais, j'ai mis à jour mon code .. Mais j'ai observé un comportement étrange. Ma vue sur chaque écran est masquée sous la barre de navigation. La vue de repositionnement résout le problème pour iOS7, mais crée des problèmes pour les anciennes versions d'iOS.

Quelqu'un peut-il m'expliquer, quelle est la raison et pourquoi cela se produit-il ?? Qu'est-ce qui a été changé dans iOS 7 qui cause ce problème ??

Toute aide serait appréciée..

61
Salman Zaidi

Essayez navigationBar.translucent = NO;, C'est YES par défaut dans iOS7.

Il est également bon de jeter un œil à cette partie de la documentation de UINavigationBar:

Nouveau comportement sur iOS 7. La valeur par défaut est OUI. Vous pouvez forcer un arrière-plan opaque en définissant la propriété sur NO. Si la barre de navigation a une image d'arrière-plan personnalisée, la valeur par défaut est déduite des valeurs alpha de l'image — OUI si elle a un pixel avec alpha <1.0 Si vous envoyez setTranslucent: OUI à une barre avec une image d'arrière-plan personnalisée opaque, elle s'appliquera une opacité du système inférieure à 1,0 pour l'image. Si vous envoyez setTranslucent: NO à une barre avec une image d'arrière-plan personnalisée translucide, elle fournira un arrière-plan opaque pour l'image à l'aide de la barre barTintColor si définie, ou noir pour UIBarStyleBlack ou blanc pour UIBarStyleDefault si barTintColor est nul.

Modifier :

La définition de la valeur "navigationBar.translucent" provoque une exception si vous exécutez le projet sur des appareils/simulateurs ayant des versions iOS plus anciennes.

Vous pouvez donc ajouter une vérification de version comme celle-ci:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0)
{
    navigationBar.translucent = NO;
}

Une autre option serait de définir:

vc.edgesForExtendedLayout = UIRectEdgeNone;

Swift 3 :

vc.edgesForExtendedLayout = []
124
null

Vous pouvez arrêter vos vues sous la barre de navigation, dans votre viewController:

self.edgesForExtendedLayout = UIRectEdgeNone;
44
Daniel Broad

Swift 3 +:

self.edgesForExtendedLayout = []
20
David Seek

Si vous n'avez pas besoin d'une barre de navigation translucide dans votre application, vous pouvez résoudre ce problème sur iOS7 et iOS6 sans modifications de code.

Dans le storyboard, sélectionnez votre contrôleur de navigation, puis ouvrez "Inspecteur des attributs". Ensuite, sous "Mesures simulées", définissez "Barre supérieure" sur une certaine valeur mais pas sur "translucide":

Setting Top Bar style

Maintenant, vos vues sur iOS6 et iOS7 auront le même positionnement qu'auparavant.

11
gladimdim

Le point # 7 sur cette liste fait l'affaire. Vous devez toujours l'envelopper dans un code de vérification iOS 7 comme la réponse de @ null:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0) {
    viewController.edgesForExtendedLayout = UIRectEdgeNone;
}

L'article entier est utile à ceux qui passent à iOS 7.

9
Lawrence Kesteloot

Utilisez cette propriété pour votre VC, afin d'éviter le chevauchement de la barre d'état ur avec votre VC Swift:

self.edgesForExtendedLayout = []

Objectif c

self.edgesForExtendedLayout = UIRectEdgeNone;
5
Aks

Recherchez cette clé: UIViewControllerBasedStatusBarAppearance.

Il est utilisé dans le fichier PLIST d'informations de votre application et apparaîtra comme:

Afficher l'apparence de la barre d'état basée sur le contrôleur

Cela vous permettra de contrôler l'apparence de la barre d'état. Il y a un tas de changements d'API pour les barres d'état, allez voir dans la documentation les nouvelles méthodes UIViewController telles que

- (void)prefersStatusBarHidden;

3
Guy Kogus

Dans Swift 2.2, utilisez

self.edgesForExtendedLayout = .None
2
matthew

Pour moi, le meilleur moyen de transparence Navigation Bar consiste à modifier l'ombreImage et l'arrière-planImage de la barre.

navigationController?.navigationBar.isTranslucent = true
navigationController?.navigationBar.backgroundColor = nil
navigationController?.navigationBar.setBackgroundImage(UIImage(named: "navBarBackground")?.resizableImage(withCapInsets: .zero, resizingMode: .stretch), for: .default)  
navigationController?.navigationBar.shadowImage = UIImage()
0
saltwat5r