web-dev-qa-db-fra.com

Comment puis-je faire que mon iOS7 UITableViewController n'apparaisse PAS sous la barre d'état supérieure?

Mon contrôleur racine est un TabBarController (application à onglets). L'un des onglets est un UITableViewController. Lorsque je passe à cela et que je fais défiler les éléments, ils apparaissent sous la barre d'état en haut (signal, batterie, etc.). Je ne veux pas ça. Je veux que ce soit opaque ou ... quelque chose. Le texte des cellules de la table sous-jacentes aux informations d'état est discordant.

Puis-je résoudre ce problème dans mon Storyboard avec certains paramètres d'attributs que je ne comprends pas? Ou dois-je ajouter des méthodes à mes sous-classes? Ou peut-être dois-je envelopper mon UITableViewController avec un autre type de contrôleur?

J'ai essayé de nombreuses variantes des paramètres Layout ViewController et Extend Edges dans la page d'attributs Storyboard, mais aucune d'entre elles ne semble la changer pour le mieux.

Update: Je pense que mon problème est très similaire à iOS 7: UITableView apparaît sous la barre d'état . La seule différence, c'est que je suis incorporé dans un TabBarController et que ce cas est celui de la vue racine. J'ai essayé la solution listée ici consistant à incorporer dans une variable NavigationController et à régler Show Navigation Bar sur False, mais cela ne faisait aucune différence.

Captures d'écran:

Mon storyboard (rétréci) montrant un contrôleur à onglets, avec 2 enfants, une seule vue et l'autre vue sous forme de tableau.

Storyboard

Paramètres du contrôleur de barre d'onglets

tab bar controller settings

Paramètres du contrôleur de vue de table

table view controller settings

À quoi ressemble l'application sur mon téléphone

enter image description here

Comment l'histoire s'est terminée

Malgré les nombreuses réponses ci-dessous, aucune d’entre elles n’a vraiment fonctionné. Un peu, mais pas vraiment. J'ai également essayé l'approche Intégrer dans NavigationController, qui posait également des problèmes. Qu'est-ce qui a bien fonctionné?

  1. Ajouter UIViewController
  2. Définir la relation de contrôleur enfant avec celui-ci et le contrôleur de barre d’onglet (tout comme les deux autres que j’avais déjà)
  3. Ajoutez une TableView (pas un contrôleur) au nouveau UIViewController, positionnez-la comme vous le souhaitez, elle se positionnera au bas de la barre d'état.
  4. Définissez les variables delegate et tableSource de TableView en tant que nouveau contrôleur
  5. Créer une sous-classe UIViewController personnalisée et mettre à jour le type de classe du contrôleur dans le storyboard
  6. Copier les méthodes liées à la table de ma sous-classe UITableViewController personnalisée dans ma nouvelle sous-classe
  7. Sélectionnez mon prototype de cellule de tableau à partir de l'original, puis faites-le glisser vers la nouvelle vue du tableau.
  8. Heureusement supprimer le TableViewController d'origine (et le wrapper NavigationController) aussi
  9. Mettre à jour l'élément de la barre d'onglets pour qu'il corresponde au précédent
  10. Chock un autre pour "vous essayez de dur"
33
Travis Griggs

Au cas où quelqu'un raterait la section Comment l'histoire s'est terminée à la fin de la question (maintenant longue), la réponse courte est: Utilisez un simple UIViewController avec une TableView , au lieu d'un TableViewController si vous le souhaitez. atteindre l'objectif déclaré.

2
Travis Griggs

Essayez ceci dans viewDidLoad:

self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);

20 px étant la hauteur de la barre d'état. Si vous avez une barre de navigation, utilisez 64 au lieu de 20

33
JustAnotherCoder

Au cas où quelqu'un lirait encore ce fil:

Ce qui a fonctionné pour moi, c’est également de décocher les options «Extension des bords» du contrôleur de la barre d’onglet parent. Cela donne un comportement cohérent dans iOS7 ainsi que iOS6.

15
Florian

J'avais le même problème lorsque j'utilisais SWRevealController. 

En utilisant les commentaires ci-dessus et ci-dessous, j'ai pu le faire en mettant cela dans 

-(void)viewWillAppear instead of ViewDidLoad
     self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
5
user3696154

Avez-vous essayé d'ajouter quelque chose comme ceci à la méthode viewWillAppear du contrôleur de vue:

 if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
 {
    self.edgesForExtendedLayout = UIRectEdgeNone;
 }
4
Robert

Vous pouvez également résoudre ce problème via Storyboard.

Sélectionnez la vue Tableau dans la structure du projet (côté gauche de l'éditeur), puis sélectionnez Propriétés (côté droit)> onglet Inspecteur de taille> Vue Défilement> Encarts de contenu> Haut.

2
Elsa

J'ai ajouté ce qui suit à viewWillAppear

self.tableView.contentInset = UIEdgeInsetsMake(22, 0, 0, 0);
2
Brian Broom

On dirait que vous voulez juste rendre la barre de navigation non transparente, vous pourriez essayer d’utiliser 

[self.navigationController.navigationBar setTranslucent:NO];
1
hv88

J'ai rencontré le même problème et la solution qui a fonctionné pour moi a été d'ajouter une vue d'en-tête de section: 

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

J'ai ensuite ajouté 20 à Origin.y de mon texte sur l'en-tête.

J'ai ensuite changé la hauteur de l'en-tête en ajoutant 20 à la hauteur d'origine à l'aide du bouton 

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return myHeight+20;
}
1
RYUX123

En ce qui concerne iOS 8.4, je n’arrivais à rien avec les différentes options de scénario présentées dans d’autres réponses.

J'ai travaillé autour de cela sans recourir à des constantes dimensionnelles en mettant une vue régulière dans mon contrôleur d'onglets, puis en le complétant avec une "vue conteneur" que j'ai ensuite connectée à mon UITableViewController avec une séquence "embed".

Mon tableau respecte maintenant à la fois ma barre de navigation et la barre d’onglet en bas.

1
bitmusher

supposez que le @IBOutlet de votre table est

 @IBOutlet var tableView: UITableView!

créer une fonction prepareTable (). ajouter la ligne ci-dessous dans cette méthode

tableView.contentInset.top = UIApplication.shared.statusBarFrame.height

appeler cette méthode depuis ViewDidLoad ()

1
Dilip Jangid

Pour moi, une solution facile était (le code est en C # car il semble invalide) ...

  1. Juste dans le constructeur UITableViewController, créez un nouveau UIView (définissez la même dimension du TableView).

  2. Ajoutez la TableView à la nouvelle vue créée. 

  3. Définissez la nouvelle vue créée sur la propriété Vue de UITableViewController ...

Sur le constructeur de UITableViewController

var view = new UIView ();
view.Frame = this.TableView.Frame;
view.AddSubview (this.TableView);

this.View = view;
1
Ricardo LR

Supposons que votre vue hiérarchique, ou Storyboard, est un contrôleur à barre d'onglets qui possède actuellement un contrôleur d'affichage de table. Lorsque vous exécutez l'application, les cellules de votre vue tableau s'exécutent sous la barre d'état qui semble avoir un arrière-plan transparent. Ça craint!

Si vous passiez des heures à essayer tout ce que vous pouviez trouver sur StackOverflow sans succès, vous sentiez qu'il était peut-être temps d'envisager une nouvelle carrière et vous prépariez à composer le 1-800-LUV-TRUK ou le 1-800-SHT-KIKR, donnez-vous une tape dans le dos, ouvrez l’élixir que vous buvez dans des moments comme celui-ci, car ce n’est pas de votre faute. Vraiment. Travis a absolument raison de dire qu’aucune quantité de code dans viewDidLoad, viewWillAppear, viewDidAppear ou un bouton sélectionnant/désélectionnant dans IB n’aidera dans cette situation. 

La solution de Travis ci-dessus va certainement marcher, mais c'est un peu long, il y a du copier-coller de code, j'ai une durée d'attention assez courte pour qu'un épisode de Bugs Bunny me paraisse être un long métrage, alors je sais que je Je vais tout gâcher. Mais, hé, votre kilométrage peut varier et va probablement varier. Anyhoo ...

Dans Xcode 7.3 pour une application fonctionnant sous iOS 9 (je suppose 7 et 8 mais je ne le sais pas avec certitude et je suis actuellement trop paresseux pour le vérifier), il existe un moyen plus simple qui n'exige pas l'écriture de code. Et tout est fait dans Interface Builder de Xcode.

( Avertissement: Désolé si l'un des termes n'est pas exact. Faites-le-moi savoir où je me suis trompé et je corrigerai toute erreur d'étiquetage.)

  1. Accédez à la zone Utilitaires d'Interface Builder et sélectionnez la bibliothèque d'objets dans le volet Bibliothèque.

  2. Sélectionnez un objet Contrôleur de vue de navigation et faites-le glisser dans votre scène Storyboard. Vous remarquerez que deux éléments de scène apparaissent lors du déplacement: il s'agit d'une scène de contrôleur de navigation et d'une scène de contrôleur d'affichage de table. 

  3. Supprimez la scène de contrôleur de vue de table en double fournie avec votre scène de contrôleur de navigation.

  4. Sélectionnez la connexion de relation entre votre contrôleur de barre d’onglet et votre contrôleur de vue de table et cliquez sur "Supprimer".

  5. Repositionnez le contrôleur de navigation et votre contrôleur d'affichage de table comme vous le souhaitez dans votre storyboard.

  6. Faites glisser la scène du contrôleur de la barre d’onglet vers la scène du contrôleur de navigation et sélectionnez "Relation Segue, voir le contrôleur".

  7. Tout en maintenant la touche Contrôle enfoncée, faites glisser votre scène de contrôleur de navigation vers votre scène et sélectionnez "Relation Segue, contrôleur de vue racine".

  8. Enfin, dans la bibliothèque Objets des utilitaires, faites glisser un objet Elément de navigation dans la vue Table de la scène de votre contrôleur de vue tableau. 

Désormais, lorsque vous exécuterez votre application, vous aurez une barre de navigation et les cellules de votre vue tableau n'apparaîtront plus sous une barre d'état transparente.

J'espère que cela t'aides.

0
Jim Hillhouse