Définition d'un label de UITableView de tableFooterView - avec mise en page automatique
Quand ma vue de la table est vide, je veux ajouter une simple étiquette dans le tableview pied de page pour afficher un "non" contenu du message. Ça marchait très bien quand j'ai été la mise en images de la UILabel et la UIView que j'ai utilisé pour footerView, mais maintenant, je vais essayer de le convertir à l'aide de l'auto-mise en page, et je ne peux pas le faire fonctionner.
Voici ce que j'ai fais:
//Create the footer
UIView *tempFooter = [[UIView alloc] init];
UILabel *atext = [[UILabel alloc] init];
tempFooter.translatesAutoresizingMaskIntoConstraints = NO;
atext.translatesAutoresizingMaskIntoConstraints = NO;
atext.numberOfLines = 0;
[atext setText:@"Add Some Text"];
atext.textAlignment = NSTextAlignmentCenter;
atext.font = [UIFont italicSystemFontOfSize:14];
atext.textColor = [UIColor grayColor];
atext.backgroundColor = [UIColor clearColor];
atext.lineBreakMode = NSLineBreakByWordWrapping;
//add label to footer view, and add constraints
[tempFooter addSubview:atext];
NSLayoutConstraint *tvatt1 = [NSLayoutConstraint constraintWithItem:tempFooter
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:atext attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:10.0];
NSLayoutConstraint *tvatt2 = [NSLayoutConstraint constraintWithItem:tempFooter
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:atext
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:10.0];
NSLayoutConstraint *tvatt3 = [NSLayoutConstraint constraintWithItem:tempFooter
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:atext
attribute:NSLayoutAttributeTop
multiplier:5.0
constant:0];
NSLayoutConstraint *tvatt4 = [NSLayoutConstraint constraintWithItem:tempFooter
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:atext
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant: 0];
[tempFooter addConstraints: @[tvatt1, tvatt2, tvatt3, tvatt4]];
//set the footerview
self.tview.tableFooterView = tempFooter;
Lorsque je l'exécute, j'ai eu un crash:
2014-09-08 19:57:16.594 SimpleList[49442:60b] * échec d'Assertion dans
-[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794 2014-09-08
19:57:21.073 SimpleList[49442:60b] * Résiliation d'application en raison de uncaught
exception NSInternalInconsistencyException', la raison: 'Mise en page Automatique
toujours requis après l'exécution d'-layoutSubviews. UITableView de l'
la mise en œuvre de layoutSubviews besoins à l'appel de super
Je ne suis pas sûr de ce que je fais mal. J'ai aussi essayé l'ajout de contraintes pour la self.tview.tableFooterView
wrt l' tempFooter
(pinning contre toutes les 4 côtés) mais cela ne change pas le crash. J'ai aussi l'appeler:
[self.tview.tableFooterView layoutSubviews];
mais ça n'aide pas non plus.
Les idées de ce que je fais mal?
Non, malheureusement les résultats dans un autre crash: 2014-09-08 22:46:19.905 Incapable de satisfaire simultanément des contraintes. Probablement au moins une des contraintes dans la liste suivante est une que vous ne voulez pas.... ( "<NSLayoutConstraint:0x117137d80 V:[UIView:0x10dfd5170(17)]>", "<NSAutoresizingMaskLayoutConstraint:0x117082480 h=--& v=--& V:[UIView:0x10dfd5170(0)]>" )
Cette nouvelle erreur est causée par le pas de hauteur définie pour le pied de page vue (de sorte qu'il sera de 0), mais ayant des contraintes pour le haut et le bas pour un label qui a une valeur non nulle de la hauteur. Voir ma réponse.
OriginalL'auteur Z S | 2014-09-09
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas régler translatesAutoresizingMaskIntoConstraints PAS pour les vues de table, leurs cellules, ou à la table d'en-tête et pied de page vues (ou pour votre contrôleur de soi-même.vue d'ailleurs). C'est ok d'utiliser les contraintes pour les vues à l'intérieur de ce point de vue (la vue de contenu de cellules ou de l'en-tête et pied de page vues). J'ai ajouté une version simplifiée de votre code de viewDidLoad, et cela a fonctionné comme prévu. Notez que vous devez donner le pied de page afficher une hauteur et une position x (la position sur l'axe y et la largeur sont ignorés),
Je ne suis pas sûr de ce que vous essayez d'accomplir avec votre contrainte, tvatt3. Le multiplicateur (vous avez 5) ne pas faire n'importe quoi avec un haut ou à gauche de la contrainte, car la valeur de ces attributs est de 0. J'ai utilisé le visuel contraintes, plutôt que la méthode que vous avez utilisée, mais quand j'ai utilisé votre code pour ajouter les contraintes, il a travaillé également .
[atext setText:@"Add Some Text. Now add a lot more text with newlines thrown in for good measure. Does this work beyond a certain height?\n\nNow how do you calculate the height?"];
plein pied de page ne présente plus. J'ai essayé d'utiliser[atext systemLayoutSizeFittingSize: UILayoutFittingExpandedSize]
pour définir le cadre pour le pied de page avant de l'installer, mais il bloqueJe thinkk je avoir de travail; j'ai mis le footerView dans
viewWillLayoutSubviews
et régler la hauteur du pied de page à l'aide desystemLayoutSizeFittingSize:
. Le seul problème: encore une "Impossible de satisfaire simultanément les contraintes" message dans le débogueur. Celui-ci semble suspect, mais aucune idée de comment il est arrivé là: "<NSLayoutConstraint:0x7fa2d0050d20 'UIView-Encapsulé-Mise en page-Largeur H:[UIView:0x7fa2d005acb0(0)]>"Compris: le visuel de la contrainte pour l'épinglage de l'étiquette à l'horizontale ne fonctionnait pas. J'ai supprimé et ajouté un centrage de la contrainte de la constraintWithItem entre l'étiquette et tempFooter (avec NSLayoutAttributeCenterX) et cela fonctionne!
Pouvez-vous expliquer pourquoi le translatesAutoresingMaskIntoConstraints ne devraient pas être ensemble? Merci
que vous avez besoin pour donner le pied de page afficher une hauteur et une position x (la position sur l'axe y et la largeur sont ignorés)"—en fait, sous iOS 9 au moins, la largeur passé n'est pas ignoré et est utilisée pour définir la largeur de la vue.
OriginalL'auteur rdelmar
Fait intéressant, la modification de la d'un redimensionnement automatique de masque dans le xib résolu mon problème.
Contraintes qui n'ont pas de travail:
De travail:
UITableView
. Merci beaucoup! Je n'aurais jamais pensé à cela.OriginalL'auteur Phil Loden
Je viens de tombé sur un article qui a une solution qui fonctionne avec Mise en page Automatique: Dynamiquement la Taille d'Affichage de Tableau d'en-Tête ou le Pied de page à l'Aide de Mise en page Automatique par Collin Donnell
J'ai essayé et il semble bien fonctionner.
OriginalL'auteur Bringo
espère que cela va vous aider à
Je ne suis pas sûr de cela, mais il m'aider dans mon projet, d'abord ajouter chaque chose en
contentView
(tous les sous-vue et la contrainte)et vient en partie de code de
code disant de gauche attribut
je.e
temfooter doit être égale à la modification de atexte , donc besoin pour vous assurer que vos contraintes ne sont pas mauvais.
explorer ce lien(constraints.icodeforlove.com) , cela pourrait-il vous aider d'une certaine façon.
OriginalL'auteur Anurag Bhakuni
J'ai pu le faire de façon dynamique automatique de la disposition de table pied de la largeur et de la hauteur par la mise en œuvre de @rdelmar solution pour les contraintes et l'ajout de ces lignes ci-dessous. La même solution s'applique à la table d'en-tête de la vue.
P. S. je préfère Interface Builder pour les contraintes d'installation
OriginalL'auteur Paulius Vindzigelskis