Le premier écran de mon application est UITableViewController
sans barre de navigation, ce qui signifie que le contenu passe sous la barre d'état, il y a donc beaucoup de collisions de texte. J'ai ajusté les propriétés Under top bars
et celles Adjust scroll view insets
qui l'empêchent de défiler sous, mais au prix de garder le haut de la vue de la table sous. J'ai essayé de définir le UITableView
cadre pour qu'il soit décalé de 20 pixels, mais il ne semble pas prendre effet et, comme j'ai actuellement besoin que l'application soit compatible avec iOS 6, je ne peux pas passer aux storyboards iOS 7 pour forcer la mise en page automatique à utiliser le guide de hauteur supérieur. Quelqu'un a-t-il trouvé une solution qui fonctionne pour les deux versions?
Ce que j'ai essayé: définir edgesForExtendedLayout
, modifier les paramètres dans Storyboard pour Under top bars
et Adjust scroll view
forcer le cadre dans une nouvelle zone.
Une image vaut mieux que mille mots:
la source
UITableView
tête dedans, il coule également sous la barre d'état.Réponses:
Pour toute personne intéressée à répliquer cela, suivez simplement ces étapes:
UIViewController
UITableViewController
depuis la bibliothèque d'objetsSi vous suivez les étapes ci-dessus, lorsque vous exécutez l'application, vous verrez que rien, y compris le fait de modifier les cases à cocher de Xcode pour "étendre les bords sous les barres {haut, bas, opaques}", empêche la première ligne d'apparaître sous la barre d'état, vous ne pouvez pas non plus résoudre ce problème par programme.
Par exemple, dans le scénario ci-dessus, les éléments suivants n'auront aucun effet:
Ce problème peut être très frustrant, et je pense que c'est un bug de la part d'Apple, surtout parce qu'il apparaît dans leur propre pré-câblé à
UITableViewController
partir de la bibliothèque d'objets.Je suis en désaccord avec tous ceux qui essaient de résoudre ce problème en utilisant n'importe quelle forme de «nombres magiques», par exemple «utiliser un delta de 20 pixels». Ce type de programmation étroitement couplée n'est certainement pas ce qu'Apple veut que nous fassions ici.
J'ai découvert deux solutions à ce problème:
Préserver la
UITableViewController
scène de :Si vous souhaitez conserver le
UITableViewController
dans le storyboard, sans le placer manuellement dans une autre vue, vous pouvez incorporer leUITableViewController
dans unUINavigationController
(Editeur> Intégrer dans> Contrôleur de navigation) et décochez "Affiche la barre de navigation" dans l'inspecteur . Cela résout le problème sans aucun ajustement supplémentaire nécessaire, et il préserve également votreUITableViewController
scène dans le storyboard.Utiliser AutoLayout et incorporer le
UITableView
dans une autre vue (je pense que c'est ainsi qu'Apple veut que nous le fassions) :Créez un vide
UIViewController
et faites-le glisserUITableView
dedans. Ensuite, faites glisser la touche Ctrl de votreUITableView
vers la barre d'état. Lorsque la souris arrive en bas de la barre d'état, vous verrez une bulle de mise en page automatique indiquant "Top Layout Guide". Relâchez la souris et choisissez "Espacement vertical". Cela indiquera au système de disposition de le placer juste en dessous de la barre d'état.J'ai testé les deux façons sur une application vide et ils fonctionnent tous les deux. Vous devrez peut-être effectuer quelques ajustements supplémentaires pour les faire fonctionner pour votre projet.
la source
Si vous faites des choses par programme et utilisez un
UITableViewController
sans un,UINavigationController
votre meilleur pari est de faire ce qui suit dansviewDidLoad
:Swift 3
Swift plus tôt
Le
UITableViewController
défilera toujours derrière la barre d'état mais ne sera pas en dessous lorsqu'il défilera vers le haut.la source
topLayoutGuide
plutôt la longueur.UIApplication.sharedApplication.statusBarFrame.size.height
au lieu de 20.Veuillez noter: cela a fonctionné pour moi pour la configuration suivante:
Si les deux conditions ci-dessus ne sont pas remplies, votre kilométrage peut varier.
Message d'origine
J'ai créé ma vue par programme et cela a fini par fonctionner pour moi:
Source (dans la section topLayoutGuide au bas de la page 39).
la source
Ajout à la première réponse:
après que la 2ème méthode ne semblait pas fonctionner au départ, j'ai fait quelques bricolages supplémentaires et j'ai trouvé la solution.
TLDR; la deuxième solution de la réponse la plus efficace fonctionne presque, mais pour certaines versions de xCode, ctrl + glisser vers "Top Layout Guide" et sélectionner Vertical Spacing ne fait rien. Cependant, en ajustant d'abord la taille de la vue Table puis en sélectionnant "Top Space to Top Layout Guide" fonctionne
Faites glisser un ViewController vierge sur le storyboard.
Faites glisser un objet UITableView dans la vue. (Pas UITableViewController). Positionnez-le au centre à l'aide des guides de disposition bleus.
Créez votre sous-classe personnalisée d'UIViewController et ajoutez les
<UITableViewDataSource, UITableViewDelegate>
protocoles. N'oubliez pas de définir le ViewController de votre storyboard sur cette classe dans l'inspecteur d'identité.Créez une sortie pour votre TableView dans votre fichier d'implémentation et nommez-la "tableView"
Maintenant, pour la partie de ne pas couper dans la barre d'état.
Vous pouvez maintenant configurer votre vue de table comme d'habitude, et cela n'attachera pas la barre d'état!
la source
https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1
la source
self.topLayoutGuide.length
deviewDidLayoutSubviews
va bousiller la disposition des vues enfants.Sélectionnez UIViewController sur votre storyboard et décochez l'option Étendre les bords sous les barres supérieures. A travaillé pour moi. :)
la source
Voici comment l'écrire dans "Swift" Un ajustement à la réponse de @ lipka:
la source
- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
Pour Xcode 7, décocher la coche «translucide» de la barre de navigation a fonctionné pour moi.
la source
Cela le corrigera pour un UITableViewController (sans aucun nombre magique). La seule chose que je n'ai pas pu résoudre, c'est si vous êtes en conversation téléphonique, auquel cas le haut de la tableView est trop enfoncé. Si quelqu'un sait comment résoudre ce problème, veuillez nous le faire savoir.
la source
Je ne sais pas à quel point il est casher, mais j'ai constaté que ce schéma déplace la vue du ViewController vers le bas et fournit la barre d'état avec un arrière-plan solide:
Bien sûr, remplacez-le
redColor
par la couleur que vous souhaitez pour l'arrière-plan.Vous devez effectuer séparément l'un des swizzles pour définir la couleur des caractères / symboles dans la barre d'état. J'utilise
View controller-based status bar appearance = NO
etStatus bar style = Opaque black style
dans la liste, pour le faire globalement.Semble fonctionner, et je serais intéressé d'entendre des bugs ou des problèmes avec elle.
la source
La réponse de chappjc fonctionne très bien lorsque vous travaillez avec des XIB.
J'ai trouvé que la solution la plus propre lors de la création par programme de TableViewControllers consiste à envelopper l'instance UITableViewController dans un autre UIViewController et à définir des contraintes en conséquence.
C'est ici:
À la vôtre, Ben
la source
Je pense que l'approche de l'utilisation de UITableViewController pourrait être un peu différente de ce que vous avez fait auparavant. Cela a fonctionné pour moi, mais vous n'en êtes peut-être pas fan. Ce que j'ai fait, c'est avoir un contrôleur de vue avec une vue de conteneur qui pointe vers mon UItableViewController. De cette façon, je suis en mesure d'utiliser le TopLayoutGuide fourni avec mon in storyboard. Ajoutez simplement la contrainte à la vue du conteneur et vous devriez être pris en charge pour iOS7 et iOS6.
la source
J'ai fini par utiliser une vue supplémentaire avec l'arrière-plan souhaité, ajoutée après TableView et placée sous la barre d'état:
Ce n'est pas très joli, mais c'est une solution assez simple, si vous avez besoin de travailler avec des vues sans xib, et à la fois IOS6 et IOS7
la source
J'ai fait cela pour l'affichage Retina / Non-Retina comme
la source
La solution suivante fonctionne assez bien dans le code sans utiliser de constantes magiques et tient compte du fait que l'utilisateur change la classe de taille, par exemple via des rotations ou des applications côte à côte sur les iPad:
la source
Fonctionne pour swift 3 - In viewDidLoad ();
Ce code: 1. Obtient la hauteur de la barre d'état 2. Donne au haut de la vue de table un encart de contenu égal à la hauteur de la barre d'état. 3. Indique à l'indicateur de défilement le même encart, il apparaît donc sous la barre d'état.
la source
Pour ceux comme moi qui préfèrent ne pas intégrer leur
UITableViewController
dans unUIViewController
essai ceci:Une
UITableViewController
sous-classe personnalisée peut ajouter une vue de masque à la vue d'ensemble de tableView. Ajoutez le masque sur viewDidAppear et supprimez le masque sur viewWillDisappear.la source
J'avais un UISearchBar en haut de mon UITableView et les éléments suivants ont fonctionné;
Partagez et profitez ...
la source
Je l'ai fait fonctionner en définissant la taille sur la forme libre
la source
La solution d'Abrahamchez https://developer.apple.com/library/ios/qa/qa1797/_index.html a fonctionné pour moi comme suit. J'avais un seul UITableviewcontroller comme vue initiale. J'avais essayé le code offset et l'incorporation dans un navcon mais aucun des deux n'avait résolu la transparence de la barre d'état.
Ajoutez un Viewcontroller et faites-en la vue initiale. Cela devrait vous montrer des guides de mise en page supérieurs et inférieurs critiques.
Faites glisser l'ancienne Tableview dans la vue du nouveau contrôleur.
Faites tout le nécessaire pour installer la table dans le nouveau contrôleur:
Modifiez votre ancien fichier view controller.h pour hériter / sous-classe de UIViewController au lieu de UITableViewController.
Ajoutez UITableViewDataSource et UITableViewDelegate au .h du viewcontroller.
Reconnectez tout ce dont vous avez besoin dans le storyboard, comme une barre de recherche.
La grande chose est de mettre en place les contraintes, comme dans le Q&A d'Apple. Je n'ai pas pris la peine d'insérer une barre d'outils. Pas certain de la séquence exacte. Mais une icône rouge est apparue sur les guides de mise en page, peut-être lorsque j'ai construit. J'ai cliqué dessus et j'ai laissé Xcode installer / nettoyer les contraintes.
Ensuite, j'ai cliqué partout jusqu'à ce que je trouve la contrainte d'espace vertical et change sa valeur supérieure de -20 à 0 et cela fonctionne parfaitement.
la source
J'utilise un UISplitViewController avec un navigationcontroller et un tableviewcontroller. Cela a fonctionné pour moi dans la vue principale après avoir essayé de nombreuses solutions ici:
Elle est similaire à la solution de Hot Licks mais applique la sous-vue au navigationController.
la source
la source
Voici un Swift 2.3. (Xcode 8.0). J'ai créé une sous-classe de UITableView.
L'encart de contenu doit toujours être zéro (par défaut). Je le mets à zéro manuellement. Vous pouvez également ajouter une méthode de vérification qui effectue la vérification et si c'est autre chose que ce que vous voulez, obtenez simplement le bon rect. Le changement ne se reflétera que lorsque la vue de table est dessinée (ce qui n'arrive pas souvent).
N'oubliez pas de mettre à jour le TableView dans votre IB (dans le TableViewController ou tout simplement TableView dans votre ViewController).
la source
J'étais confronté à ce problème dans ios 11 mais la mise en page était correcte pour ios 8 - 10.3.3. Pour mon cas, j'ai défini une contrainte d'espace vertical sur Superview.Top Margin au lieu de Superview.Top qui fonctionne pour ios 8-11.
la source
J'ai trouvé le moyen le plus simple de le faire, surtout si vous ajoutez votre vue de table à l'intérieur de la barre d'onglets, c'est d'abord d' ajouter une vue , puis d'ajouter la vue de table à l'intérieur de cette vue . Cela vous donne les meilleurs guides de marge que vous recherchez.
la source
voir toutes les solutions: mon projet consiste simplement à utiliser xib, donc la solution avec storyboard n'a pas fonctionné pour moi. self.edgesForExtendedLayout = UIRectEdgeNone; fonctionne juste pour le contrôleur si la barre de navigation est visible. mais si votre vue est simplement dotée d'une barre d'état, cela ne fonctionnera pas. donc je combine deux conditions.
aider cela fonctionne.
la source
Si vous devez également prendre en charge iOS 6, vous devrez le déplacer de manière conditionnelle vers le bas. Autrement dit, dans iOS 7, vous devez simplement le déplacer vers le bas de 20 points (soit par
frame
manipulation ou en utilisant la mise en page automatique), et dans iOS 6, vous le laissez seul. Je ne crois pas que vous puissiez le faire dans IB, vous devrez donc le faire dans le code.ÉDITER
Vous pouvez réellement le faire dans IB, en utilisant les deltas iOS6 / iOS7. Définissez votre position dans iOS 7, puis pour iOS 6, définissez le delta Y sur -20points. Voir cette question SO pour plus d'informations.
la source
self.view.frame
etself.tableView.frame
, dans les deuxviewWillAppear
etviewDidLoad
. Pour être en sécurité, j'ai également décidésetContentNeedsDisplay
de forcer un nouveau dessin.