Voici mon code
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 50, 300, 50)];
label.textAlignment = UITextAlignmentCenter;
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
label.textColor.font = [UIFont fontWithName:@"Verdana" size:30];
label.text = @"A very long string";
etc...
Le problème est que la police est grande et ne peut pas tenir dans l'étiquette. Il affiche simplement "A very"
Que faire si tout le texte à afficher. j'ai essayé
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;
Mais ça ne marche pas pour moi. Je veux le faire par programme.
//ÉDITER
CGRect frame = CGRectMake(10, 50, 300, 50);
NSString *labelString = @"Players.";
UILabel *howManyUsersLabel = [[UILabel alloc]initWithFrame:frame];
howManyUsersLabel.textAlignment = UITextAlignmentCenter;
howManyUsersLabel.backgroundColor = [UIColor clearColor];
howManyUsersLabel.textColor = [UIColor whiteColor];
howManyUsersLabel.adjustsFontSizeToFitWidth = NO;
howManyUsersLabel.numberOfLines = 0;
CGFloat fontSize = 30;
while (fontSize > 0.0)
{
CGSize size = [labelString sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(frame.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap];
if (size.height <= frame.size.height) break;
fontSize -= 1.0;
NSLog(@"test");
}
howManyUsersLabel.font = [UIFont fontWithName:@"Verdana" size:fontSize];
Je pense que vous avez juste besoin d'ajouter ceci:
label.adjustsFontSizeToFitWidth = YES;
label.minimumFontSize = 0;
Ensuite, le texte sera automatiquement redimensionné pour s'adapter à l'étiquette.
Notez cependant que cela ne fonctionnera vraiment que si label.numberOfLines = 1, de sorte que le texte se trouve sur une seule ligne.
Si vous avez besoin que le texte soit enroulé sur plusieurs lignes mais qu'il soit toujours réduit pour s'adapter, la solution est plus complexe. Pour ce faire, vous devez calculer la taille rendue du texte, puis la réduire en boucle, comme suit:
NSString *theText = @"A long string";
CGRect labelRect = CGRectMake(10, 50, 300, 50);
label.adjustsFontSizeToFitWidth = NO;
label.numberOfLines = 0;
CGFloat fontSize = 30;
while (fontSize > 0.0)
{
CGSize size = [theText sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(labelRect.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap];
if (size.height <= labelRect.size.height) break;
fontSize -= 1.0;
}
//set font size
label.font = [UIFont fontWithName:@"Verdana" size:fontSize];
Cela réduit simplement la taille de la police jusqu'à ce qu'elle corresponde à l'étiquette.
MISE À JOUR:
À partir d'iOS7, le texte multiligne se réduira également automatiquement lorsque adjustsFontSizeToFitWidth = YES
, la deuxième partie de cette réponse n'est donc plus nécessaire (sauf si vous prenez toujours en charge iOS 6 et versions antérieures).
Enfin, j'ai une solution pour le problème d'alignement du texte en langue arabe, vous faites comme ceci:
label.text = @"هذا هو نص طويل جدا";
label.textAlignment = NSTextAlignmentNatural;
CGSize size = [labels sizeThatFits:CGSizeMake(_lblAddress.width, CGFLOAT_MAX)];
label.height = size.height;
[UILabel sizeToFit];
Cela fonctionnera pour votre problème.
Swift avec iOS 9
let maxFontSize: CGFloat = 40
let minFontSize: CGFloat = 10
label.font = UIFont(name: label.font.fontName, size: maxFontSize)!
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = minFontSize/maxFontSize
Cela n'augmente pas la taille de la police pour remplir l'étiquette. Il commence simplement par la taille maximale et diminue au besoin jusqu'au minimum. Cela suppose également que le nombre de lignes est 1.
CGRect titleRect = CGRectMake(10, 50, 300, 50);
UILabel *textTitleView = [[UILabel alloc] initWithFrame:titleRect];
textTitleView.numberOfLines = 3 //for multiple lines;
textTitleView.lineBreakMode = UILineBreakModeWordWrap;
[UIFont fontWithName:@"Verdana" size:30];
textTitleView.text = @"your text";
Interface Builder vous permet de le faire maintenant.
Alternativement, vous pouvez le faire par programme:
label.adjustsFontSizeToFitWidth = YES;
Tout semble cassé dans iOS 8 (probablement iOS 7 aussi).
-(UIFont*)fontForString:(NSString*)string toFitInRect:(CGRect)rect seedFont:(UIFont*)seedFont {
UIFont* returnFont = seedFont;
CGSize stringSize = [string sizeWithAttributes:@{NSFontAttributeName : seedFont}];
while(stringSize.width > rect.size.width){
returnFont = [UIFont systemFontOfSize:returnFont.pointSize -1];
stringSize = [string sizeWithAttributes:@{NSFontAttributeName : returnFont}];
}
return returnFont;
}
Assurez-vous de ne pas essayer d'utiliser label.adjustsFontSizeToFitWidth = YES
sinon cela deviendra vraiment confus et la nouvelle taille ne fonctionnera pas correctement.