web-dev-qa-db-fra.com

UILabel redimensionnement automatique sur la base du texte à afficher

Je travaille sur une application dans laquelle je suis obligé de redimensionner automatiquement la zone de texte en fonction du texte à afficher.

Premièrement, je ne suis pas sûr pour cela que je devrais aussi utiliser UILabel (Logiquement, c’est le meilleur choix pour afficher du texte statique, ce qui est dans mon cas) ou UITextView.

Comment je souhaite l'utiliser?
Je veux simplement lancer ma vue Étiquette ou texte avec le texte. Au lieu de cela, je définis d'abord le cadre, puis mon texte est restreint dans cette zone.

Si vous pouvez suggérer la bonne solution, ce sera d'une grande aide.

J'ai parcouru la documentation et d'autres références, mais je n'ai pas trouvé grand chose qui pourrait m'aider ou que j'aurais pu l'ignorer.

55

La méthode sizeToFit a fonctionné à merveille.

J'ai suivi.

UILabel *testLabel =[[UILabel alloc] initWithFrame:CGRectMake(6,3, 262,20 )]; // RectMake(xPos,yPos,Max Width I want, is just a container value);

NSString * test=@"this is test this is test inthis is test ininthis is test inthis is test inthis is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...";

testLabel.text = test;
testLabel.numberOfLines = 0; //will wrap text in new line
[testLabel sizeToFit];

[self.view addSubview:testLabel];
97

Vous pouvez trouver une taille de texte avec:

CGSize textSize = [[myObject getALongText] 
                    sizeWithFont:[UIFont boldSystemFontOfSize:15] 
                    constrainedToSize:CGSizeMake(maxWidth, 2000)
                    lineBreakMode:UILineBreakModeWordWrap];

alors vous pouvez créer votre UILabel comme ça:

UILabel * lbl = [[UILabel alloc] initWithFrame:CGRectMake(0,0,textSize.width, textSize.height];
[lbl setNumberOfLines:0];
[lbl setLineBreakMode:UILineBreakModeWordWrap];
[lbl setText:[myObject getALongText]];
29
j_freyre

En rapide:

testLabel = UILabel(frame: CGRectMake(6, 3, 262, 20))
testLabel.text = test
testLabel.numberOfLines = 0
testLabel.sizeToFit()

En objectif c

UILabel *testLabel = [[UILabel alloc] initWithFrame: CGRectMake(6, 3, 262, 20)]];
testLabel.text = test;
testLabel.numberOfLines = 0;
[testLabel sizeToFit];
14
Segev

Si vous voulez redimensionner UILabel uniquement en hauteur, utilisez ceci:

@property (nonatomic, weak) IBOutlet UILabel *titleLabel;

CGRect titleLabelBounds = self.titleLabel.bounds;
titleLabelBounds.size.height = CGFLOAT_MAX;
// Change limitedToNumberOfLines to your preferred limit (0 for no limit)
CGRect minimumTextRect = [self.titleLabel textRectForBounds:titleLabelBounds limitedToNumberOfLines:2];

CGFloat titleLabelHeightDelta = minimumTextRect.size.height - self.titleLabel.frame.size.height;
CGRect titleFrame = self.titleLabel.frame;
titleFrame.size.height += titleLabelHeightDelta;
self.titleLabel.frame = titleFrame;

Vous pouvez maintenant utiliser titleLabelHeightDelta pour mettre en forme d'autres vues en fonction de la taille de votre étiquette (sans utiliser autolayout).

9
Berik

Je ne suis pas sûr de bien comprendre la question, mais vous pouvez utiliser la méthode sizeToFit sur un UILabel (la méthode est héritée de UIView) pour modifier la taille en fonction de le texte de l'étiquette.

6
Erik Tjernlund

La meilleure façon de trouver le non. de lignes en fonction du texte. Vous pouvez utiliser ce code:

ceil(([aText sizeWithFont:aFont].width)/self.bounds.size.width-300); 

il retourne une valeur float.

[lbl setNumberOfLines:floatvalue];
6
Anand

Comme vous allez utiliser cette solution d'innombrables fois dans votre application, procédez comme suit:

1) Créez un répertoire appelé extensions et ajoutez un nouveau fichier appelé UILabel.Swift Avec le code suivant:

import UIKit

extension UILabel {
    func resizeToText() {
        self.numberOfLines = 0
        self.sizeToFit()
    }
}

2) Dans le code de votre application, définissez la largeur d'étiquette souhaitée et appelez simplement resizeToText():

label.frame.size.width = labelWidth
label.resizeToText()

Cela maintiendra la largeur tout en augmentant automatiquement la hauteur.

2
Alex

Veuillez noter qu'avec l'appel automatique, sizeToFit ne changera pas de taille, car il sera modifié ultérieurement par des calculs d'autolayout. Dans ce cas, vous devez configurer la contrainte de hauteur appropriée pour votre UILabel avec la valeur "height> = xx".

2
Ilja Popov

Vous pouvez changer la taille de l'étiquette en fonction de la longueur de la chaîne en utilisant cette fonction

func ChangeSizeOfLabel(text:String) -> CGSize{

    let font = UIFont(name: "HelveticaNeue", size: 12)!
    let textAttributes = [NSFontAttributeName: font]
    let size = text.boundingRectWithSize(CGSizeMake(310, 999), options: .UsesLineFragmentOrigin, attributes: textAttributes, context: nil)
    let adjustSize = CGSizeMake(size.width, size.height)
    return adjustSize
}

et l'utiliser comme ça:

laisser

showLabel.frame = CGRectMake(x, y, width , self.ChangeSizeOfLabel("Hello , Height is changing dynamically.....").height)
0

essayez le code ci-dessous, cela fonctionne pour multiligne

self.labelText.text = string;
self.labelText.lineBreakMode = NSLineBreakByWordWrapping;
self.labelText.numberOfLines = 0;
0
Patel Jigar