135 votes

UILabel ne rétrécit pas automatiquement le texte pour l'adapter à la taille de l'étiquette.

J'ai ce problème étrange, et je le traite depuis plus de 8 heures maintenant Selon la situation, je dois calculer UILabels la taille de façon dynamique,
Par exemple
mon UIViewController reçoit un événement et i change UILabels taille. de plus grand à plus petit. La taille de mon UILabel devient plus petit et j'obtiens la taille correcte nécessaire, mais le texte dans mon UILabel reste la même, la même taille de police, etc. J'ai besoin que la police devienne plus petite, que tout le texte s'adapte à la taille de l'écran. UILabel . La question est donc de savoir comment faire pour que le texte s'adapte à mon étiquette. autoshrinking ou quelque chose comme ça ?

Dans mon xib , UILabels autoshrink est vérifié, également nombre de lignes est fixé à 0, et aussi ma chaîne a des symboles de nouvelle ligne ( \n ), et j'ai sélectionné linebreakmode à wordwrap . Peut-être que quelqu'un s'est trouvé dans la même situation que moi et pourrait m'aider ? Je vous en serais très reconnaissant.

Merci d'avance !

EDITAR: UILabel la taille minimale de la police est fixée à 10

0 votes

Quelle est la taille minimale de votre police pour l'étiquette que vous définissez s'il vous plaît ajouter.

2voto

Mike Gledhill Points 2105

Deux ans plus tard, et cette question est toujours d'actualité...

Dans iOS 8 / XCode 6.1, je constatais parfois que mon UILabel (créé dans un UITableViewCell (avec la fonction AutoLayout activée et des contraintes flexibles pour disposer de beaucoup d'espace) ne se redimensionnait pas pour s'adapter à la chaîne de texte.

La solution, comme les années précédentes, a été de fixer le texte, et puis appelez sizeToFit .

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    . . .
    cell.lblCreatedAt.text = [note getCreatedDateAsString];
    [cell.lblCreatedAt sizeToFit];
}

(Soupir.)

2voto

iDhaval Points 4221

Je pense que vous pouvez écrire le code suivant après alloc init Label

UILabel* lbl = [[UILabel alloc]initWithFrame:CGRectMake(0, 10, 280, 50)];
lbl.text = @"vbdsbfdshfisdhfidshufidhsufhdsf dhdsfhdksbf hfsdh fksdfidsf sdfhsd fhdsf sdhfh sdifsdkf ksdhfkds fhdsf dsfkdsfkjdhsfkjdhskfjhsdk fdhsf ";
[lbl setMinimumFontSize:8.0];
[lbl setNumberOfLines:0];
[lbl setFont:[UIFont systemFontOfSize:10.0]];
lbl.lineBreakMode = UILineBreakModeWordWrap;
lbl.backgroundColor = [UIColor redColor];
[lbl sizeToFit];
[self.view addSubview:lbl];

Il fonctionne bien avec moi Utilisez-le

1 votes

Merci, mais cela ne calcule pas ou ne réduit pas la police au minimum nécessaire si je comprends bien, et aussi pourquoi votre police minimale est plus grande que la normale ?

1voto

Anand Points 726

Supposons que le messageLabel suivant soit l'étiquette que vous souhaitez utiliser pour obtenir l'effet désiré, essayez ces simples lignes de code :

    //SET THE WIDTH CONSTRAINTS FOR LABEL.
    CGFloat constrainedWidth = 240.0f;//YOU CAN PUT YOUR DESIRED ONE,THE MAXIMUM WIDTH OF YOUR LABEL.
 //CALCULATE THE SPACE FOR THE TEXT SPECIFIED.
    CGSize sizeOfText=[yourText sizeWithFont:yourFont constrainedToSize:CGSizeMake(constrainedWidth, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];
    UILabel *messageLabel=[[UILabel alloc] initWithFrame:CGRectMake(20,20,constrainedWidth,sizeOfText.height)];
    messageLabel.text=yourText;
    messageLabel.numberOfLines=0;//JUST TO SUPPORT MULTILINING.

1voto

Vaibhav Saran Points 4078

Ne fonctionne pas si numberOfLines > 1 Ce que j'ai fait a créé une condition comme celle-ci .

if(lblRecLocation.text.length > 100)
    lblRecLocation.font = [UIFont fontWithName:@"app_font_name" size:10];

1voto

Dans Swift 4 et plus :

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200.0, height: 200.0))
label.adjustsFontSizeToFitWidth = true
label.numberOfLines = 0

label.text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."

view.addSubview(label)

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