La barre de navigation apparaît sur les vues avec le nouveau SDK iOS7

113
CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

Dans les versions antérieures, cela fonctionne correctement. La barre de recherche apparaît sous la statusbarbarre de navigation et. Le tableviewapparaît sous la barre de recherche

Mais lorsque je l'exécute Xcode 5 sdk iOS 7, la barre de recherche n'est pas visible (je pense qu'elle est placée sous la barre d'état et la barre de navigation), et la barre de navigation apparaît également sur la vue du tableau.

Sera-t-il corrigé avec iOS 7une version stable?

Ou est-ce le problème de mon codage?

Ou devrions-nous le gérer en ajoutant la (y = statubar height + nav bar height)valeur y pour iOS 7?

J'ai récemment téléchargé Xcode 5 DP pour tester mes applications sous 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 fait apparaître mon contenu sous la barre de navigation et la barre d'état.

Je sais que je pourrais expliquer moi-même 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.

Est-ce que quelqu'un d'autre a rencontré ce problème?

METTRE À JOUR:

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

self.navigationController.navigationBar.translucent = NO;

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

Cependant, je n'ai pas trouvé de solution 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 lorsque je bascule l'affichage / le masquage de la barre de navigation, j'ai eu des résultats encore plus étranges. La première sous-vue (a UIScrollView) voit ses limites et son origine changées à chaque fois.


la source
4
Logiciel bêta. Les forums de développeurs Apple sont plus appropriés. De plus, le problème est explicitement mentionné dans le guide de transition.
Sulthan

Réponses:

188

Ce n'est pas tout à fait vrai. Une nouvelle propriété a été introduite dans iOS 7 qui vous permet d'ajuster le comportement de la disposition comme dans les versions précédentes d'iOS. Placez ce morceau de code dans votre contrôleur de vue, et vous devriez être prêt à partir! L'espace occupé par votre barre de navigation doit être pris en compte automatiquement

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

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

Remarque: vous devriez utiliser la dernière version GM d'iOS 7 et Xcode 5 maintenant, car l'API a changé depuis les versions bêta.

Équipage d'un homme
la source
dans Mon code, il est indiqué edgeForExtendedLayout. Utilisation de l'identifiant non déclaré UIExtendedEdgeNone. Veuillez aider.
6
Il est changé en UIRectEdgeNone
Simon
6
C'est exactement la raison pour laquelle une telle question ne doit pas être posée ou répondue ici.
Sulthan
Je ne comprends pas pourquoi si vous souhaitez conserver la compatibilité avec ios6, vous êtes obligé d'introduire un cas conditionnel par code pour vérifier si le contrôleur a cette propriété ou non ..
jerrygdm
12
Cela ne semble fonctionner que si la vue est intégrée dans un UINavigationController.
pojo
37

Capture d'écran du storyboard

Si vous travaillez dans Storyboard (ce que je recommande fortement!), C'est la solution: vous pouvez désactiver "Extend Edges" de votre ViewController dans le storyboard. Vous devez le faire pour chaque viewController. Vous pouvez désactiver les bords étendus en cliquant sur l'icône viewController dans stortyboard (en plus du productOwner sous la vue elle-même), puis en sélectionnant l'inspecteur d'attributs (comme le montrent les images).

Cela définira également les lignes d'alignement comme iOS 6.

Un autre excellent outil de xCode 5 est "Aperçu": cliquez sur le bouton majordome (assistant éditeur) et sélectionnez Aperçu. là, vous pouvez sélectionner iOS 6 et voir à quoi ressemblera la conception de votre storyboard sur iOS 6.

C'est tout simplement génial: D

[Mettre à jour]

Attention: la désactivation de «Prolonger les bords» peut entraîner une lueur noire sur la barre de navigation lorsque l'application entre en arrière-plan sur iOS7. la lueur sera également visible sur la vue multitâche (double pression sur le bouton d'accueil). ceci peut être résolu en définissant la couleur d'arrière-plan de la barre de navigation sur blanc.

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];
MQoder
la source
Oui, c'est la solution à venir du point de vue du storyboard. Je vous remercie.
jpittman le
12

Comme le dit l'OP, il existe une solution simple à cela qui consiste à définir la barre de navigation pour qu'elle soit opaque. Plutôt que de le faire dans le code, décochez simplement "Translucide" pour votre barre de navigation racine:

entrez la description de l'image ici

Offres
la source
8

self.edgesForExtendedLayout=UIRectEdgeNone;

Cela fonctionne sur le simulateur iOS 7 (Xcode 5 DP5)

yhlin
la source
2
cela fonctionne bien dans ios7, mais si j'ai exécuté l'application sur ios 6 et plus tôt, les vues sont déplacées vers le haut. Une solution pour cela ?. Nous devons également définir cette propriété dans chaque méthode de chargement viewdid du contrôleur de vue?
loganathan
vous pouvez toujours vérifier si l'iOS actuel est 7 avec ceci si:if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
Aviel Gross
2

ces réponses ont toutes été utiles, en particulier celles de MQoder, mais pour moi, j'ai également dû définir la barre supérieure par défaut sur "navigation noire opaque".

entrez la description de l'image ici

Jasonpurdy
la source
1

La réponse de @One Man Crew est correcte, mais:

Je recommanderais d'utiliser ce code pour éviter les erreurs lors de l'exécution de l'application sur les anciennes versions:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif
Yossi
la source
0

self.edgesForExtendedLayout = UIRectEdgeNone;

Et vous devez le faire sur l'application AppDelegate #: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

Sinon, la couleur d'arrière-plan de la barre de navigation deviendra grise. Parce que la barre de navigation transparente chevauche la fenêtre.

EIMEI
la source
0

Si vous souhaitez conserver la transparence lorsque l'utilisateur fait défiler votre vue de tableau, vous pouvez définir le contentInset de celui-ci:

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);
Enrico Susatyo
la source
-1

Une solution consiste à utiliser le contrôleur de navigation. Cela résout automatiquement le problème. Utilisez également Xcode 5 au lieu des versions Xcode Preview car il s'agit de versions bêta.

Jayprakash Dubey
la source