12 votes

Le texte des étiquettes UILabel n'est pas automatiquement redimensionné avec la mise en page automatique.

J'essaie d'implémenter une contrainte UITableViewCell et tout fonctionne parfaitement, à l'exception de la sous-classe UILabel . Les contraintes que j'ai mises en place sont bien appliquées, mais le texte à l'intérieur de l'étiquette n'est pas redimensionné à une taille de police plus petite lorsque les contraintes entrent en conflit. Au contraire, la hauteur de l'UILabel est tronquée et la taille de la police reste la même, ce qui signifie que les lettres sont coupées en haut et en bas.

Y a-t-il une méthode que je dois appeler pour que cela fonctionne ? Je pensais que la mise en page automatique serait suffisamment intelligente pour redimensionner automatiquement la taille de la police. Je ne comprends donc pas pourquoi cela se produit.

Code pertinent :

self.label = [[UILabel alloc] initWithFrame:CGRectZero];
self.label.textColor = [UIColor whiteColor];
self.label.translatesAutoresizingMaskIntoConstraints = NO;
self.label.textAlignment = NSTextAlignmentCenter;
self.label.numberOfLines = 1;
[self.contentView addSubview:self.label];

NSLayoutConstraint *otherViewToLabelHorizontalConstraint =  // Make sure that the label is always to the right of the other view.
                    [NSLayoutConstraint constraintWithItem:self.label 
                                                 attribute:NSLayoutAttributeLeft 
                                                 relatedBy:NSLayoutRelationGreaterThanOrEqual
                                                    toItem:self.otherView 
                                                 attribute:NSLayoutAttributeRight 
                                                multiplier:1.0
                                                  constant:0.0];

NSLayoutConstraint *aTextFieldToLabelVerticalConstraint = 
                    [NSLayoutConstraint constraintWithItem:self.label 
                                                 attribute:NSLayoutAttributeTop 
                                                 relatedBy:NSLayoutRelationGreaterThanOrEqual
                                                    toItem:self.aTextField 
                                                 attribute:NSLayoutAttributeBottom 
                                                multiplier:1.0
                                                  constant:0.0];

Fondamentalement, ces contraintes sont destinées à imposer une cellule dans laquelle otherView est sur la gauche, aTextField se trouve à droite de otherView au même niveau y, et l'étiquette est en dessous de aTextField et à droite du bas de otherView .

Comme d'habitude, merci pour toute aide dans ce domaine.

7voto

sunkehappy Points 4423

Vous devez

myLabel.adjustsFontSizeToFitWidth = YES;
myLabel.minimumScaleFactor = .5f;

La taille de la police de l'étiquette sera alors ajustée automatiquement.

3voto

ale0xB Points 1273

J'ai résolu ce problème en définissant une contrainte de largeur obligatoire pour la vue à laquelle je liais l'étiquette.

   NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0f constant:width];

Et assurez-vous que la priorité de cette contrainte est définie sur UILayoutPriorityRequired.

[constraint setPriority:UILayoutPriorityRequired];

Le texte était redimensionné lors de l'épinglage de l'étiquette à la vue supérieure mais pas au champ de texte, j'en ai donc déduit qu'il devait y avoir un problème avec les tailles intrinsèques des éléments impliqués dans le calcul de la largeur finale de l'étiquette.

2voto

Eric Allam Points 317

Parallèlement à la mise en place de adjustsFontSizeToFitWidth et le minimumScaleFactor Vous devez également définir la compression du contenu de l'étiquette comme ayant une faible priorité. Consultez la section "Résistance à la compression et compression du contenu" de ce document. essai d'objc.io . En fait, si votre étiquette a une priorité de résistance à la compression inférieure à celle de la contrainte de queue, l'étiquette doit être redimensionnée :

[myLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
                                 forAxis:UILayoutConstraintAxisHorizontal];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X