web-dev-qa-db-fra.com

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

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 précédentes, cela fonctionnait correctement. La barre de recherche apparaît sous la variable statusbar et la barre de navigation. La tableview apparaît sous la barre de recherche

Mais lorsque je lance ceci sur 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 au-dessus de la vue Tableau.

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

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

Ou devons-nous le gérer en ajoutant la valeur y (y = statubar height + nav bar height) 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 prendre en compte la barre d'état et la barre de navigation.

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

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

En conséquence, mon contenu apparaît sous la barre de navigation et la barre d'état.

Je sais que je pourrais me rendre compte de la hauteur moi-même en obtenant la hauteur de l'écran principal, en soustrayant la hauteur de la barre d'état et celle 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 NO:

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, lorsque vous visualisez 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 constaté des résultats encore plus étranges. La première sous-vue (une UIScrollView) obtient ses limites et son origine est modifiée à chaque fois.

111
user2110287

Ce n’est pas tout à fait vrai. Une nouvelle propriété introduite dans iOS 7 permet d’ajuster le comportement de la présentation 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 comptabilisé automatiquement 

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

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

Remarque: vous devriez maintenant utiliser la dernière version GM d'iOS 7 et Xcode 5, car l'API est passée des versions bêta.

188
One Man Crew

Screenshot from storyboard

Si vous travaillez dans Storyboard (ce que je recommande vivement!), Voici 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 contours étendus en cliquant sur l'icône viewController dans Stortyboard (à côté de ProductOwner situé sous la vue elle-même), puis en sélectionnant l'inspecteur d'attributs (comme le montre les images).

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

"Aperçu" est un autre excellent outil de xCode 5: cliquez sur le bouton du majordome (assistant éditeur) et sélectionnez Aperçu. Là, vous pouvez sélectionner iOS 6 et voir à quoi ressemblera votre scénarisation sur iOS 6. 

C'est juste génial: D

[Mettre à jour]

Faites attention: la désactivation de "Extension des bords" peut produire 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 (appuyez deux fois sur le bouton d'accueil). Pour résoudre ce problème, définissez la couleur d'arrière-plan de la barre de navigation dans le blanc.

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];
37
MQoder

Comme le dit le PO, il existe une solution simple à ce problème, qui consiste à définir la barre de navigation sur opaque. Plutôt que de faire cela dans le code, décochez simplement "Translucent" pour votre barre de navigation racine:

enter image description here

12
Bids

self.edgesForExtendedLayout=UIRectEdgeNone;

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

8
yhlin

ces réponses étaient toutes utiles, en particulier MQoder, mais pour moi, je devais également définir la barre supérieure par défaut sur "navigation noire opaque". 

enter image description here

2
jasonpurdy

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
1
Yossi

Si vous souhaitez conserver la transparence lorsque l'utilisateur fait défiler la vue tableau, vous pouvez en définir le contentInset:

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

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 gris. Parce que la barre de navigation transparente recouvre la fenêtre.

0
EIMEI