J'ai essayé de chercher en ligne, mais je n'ai pas trouvé de réponse claire à mon problème, je suis donc venu vous demander votre avis d'expert. J'ai une vue avec 2 étiquettes dessus. La première étiquette est utilisée pour afficher l'abréviation d'un nom, 2-3 lettres. et la deuxième étiquette montre le nom complet.
La question que je me pose est de savoir s'il existe un moyen de dimensionner dynamiquement l'étiquette en fonction du type de police, de la taille et de la longueur de chaîne indiqués? Je demande parce que je voudrais que la deuxième étiquette soit proche de la première sans trop d'espace vide entre les deux ou sans que la première étiquette ne chevauche la seconde.
La raison pour laquelle ce n'est pas tout dans une seule étiquette est parce que la première étiquette doit avoir une police plus grande et un jeu de couleurs différent de la deuxième étiquette.
Tout conseil est grandement appréciée.
Vous pouvez calculer la taille dans laquelle votre chaîne apparaîtra, puis définir le cadre de votre UILabel à cette taille, voir le code suivant comme exemple -
//Calculate the expected size based on the font and linebreak mode of your label
CGSize maximumLabelSize = CGSizeMake(296,9999);
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font
constrainedToSize:maximumLabelSize
lineBreakMode:yourLabel.lineBreakMode];
//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;
Mise à jour -
Utilisation sizeWithAttributes:
à la place, qui prend maintenant un NSDictionary
. Passez la paire avec la clé UITextAttributeFont
et votre objet de police comme ceci:
CGSize size = [string sizeWithAttributes:
@{NSFontAttributeName:
[UIFont systemFontOfSize:17.0f]}];
Vérifiez Remplacement de la taille obsolèteWithFont: dans iOS 7? pour plus de détails
Cela fera également l'affaire et tiendra compte du texte attribué
label.attributedText = attrString;
CGSize maximumLabelSize = CGSizeMake(187,CGFLOAT_MAX);
CGSize requiredSize = [label sizeThatFits:maximumLabelSize];
CGRect labelFrame = label.frame;
labelFrame.size.height = requiredSize.height;
label.frame = labelFrame;
'sizeWithFont:' est obsolète: d'abord obsolète dans iOS 7.0.
essayez donc sizeWithAttributes
- (void)viewDidLoad
{
[super viewDidLoad];
label = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 300, 20)];
label.backgroundColor = [UIColor blueColor];
const CGFloat fontSize = 30;
UIFont *regularFont = [UIFont systemFontOfSize:fontSize];
UIColor *foregroundColor = [UIColor blackColor];
attrs = [NSDictionary dictionaryWithObjectsAndKeys:
regularFont, NSFontAttributeName,
foregroundColor, NSForegroundColorAttributeName
, nil];
NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc]
initWithString:@"Test Text"
attributes:attrs];
[label setAttributedText:attributedText];
[self.view addSubview:label];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CGSize expectedLabelSize = [label.text sizeWithAttributes:attrs]; // iOS 7 Code <--
CGRect newFrame = label.frame;
newFrame.size.width = expectedLabelSize.width;
label.frame = newFrame;
NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc]
initWithString:@"Longer Test Text"
attributes:attrs];
[label setAttributedText:attributedText];
}
Comme sizeWithFont:
est déconseillé dans iOS 7 , vous devez utiliser sizeWithAttributes
(comme l'explique Maver ici ). Afin de simplifier le code, vous pouvez ajouter une méthode que vous pouvez réutiliser comme ceci:
-(CGRect)rectForText:(NSString *)text
usingFont:(UIFont *)font
boundedBySize:(CGSize)maxSize
{
NSAttributedString *attrString =
[[NSAttributedString alloc] initWithString:text
attributes:@{ NSFontAttributeName:font}];
return [attrString boundingRectWithSize:maxSize
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
}
Et profitez-en
CGSize maximumLabelSize = CGSizeMake(280,9999);
UIFont *font = [UIFont systemFontOfSize:20];
CGRect titleRect = [self rectForText:post.title // <- your text here
usingFont:font
boundedBySize:maximumLabelSize];
En plus de la réponse de Saurabh. J'ai eu le même problème et vous devriez ajouter cette ligne[yourLabel setNumberOfLines:0];
pour que tout le texte soit affiché en X lignes.