Question

Existe-t-il un moyen d'avoir plusieurs lignes de texte dans UILabel comme dans le UITextView ou devrais-je utiliser le second à la place?

Était-ce utile?

La solution

J'ai trouvé une solution.

Il suffit d'ajouter le code suivant:

// Swift
textLabel.lineBreakMode = .ByWordWrapping // or NSLineBreakMode.ByWordWrapping
textLabel.numberOfLines = 0 

// For Swift >= 3
textLabel.lineBreakMode = .byWordWrapping // notice the 'b' instead of 'B'
textLabel.numberOfLines = 0

// Objective-C
textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

// C# (Xamarin.iOS)
textLabel.LineBreakMode = UILineBreakMode.WordWrap;
textLabel.Lines = 0;  

Réponse ancienne restaurée (pour référence et développeurs prêts à prendre en charge iOS en dessous de 6.0):

textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

Sur le côté: les deux valeurs d'énumération donnent 0 De toute façon.

Autres conseils

Dans IB, définissez le nombre de lignes sur 0 (permet des lignes illimitées)

Lorsque vous tapez dans le champ de texte à l'aide d'IB, utilisez "Alt-Rubur" pour insérer un retour et accédez à la ligne suivante (ou vous pouvez copier dans le texte déjà séparé par les lignes).

La meilleure solution que j'ai trouvée (à un problème par ailleurs frustrant qui aurait dû être résolu dans le cadre) est similaire à celle de Vaychick.

Il suffit de définir le nombre de lignes sur 0 dans IB ou le code

myLabel.numberOfLines = 0;

Cela affichera les lignes nécessaires mais repositionnera l'étiquette de sorte que son centre centré horizontalement (de sorte qu'une étiquette de ligne et 3 lignes est alignée dans leur position horizontale). Pour résoudre ce problème, ajoutez:

CGRect currentFrame = myLabel.frame;
CGSize max = CGSizeMake(myLabel.frame.size.width, 500);
CGSize expected = [myString sizeWithFont:myLabel.font constrainedToSize:max lineBreakMode:myLabel.lineBreakMode]; 
currentFrame.size.height = expected.height;
myLabel.frame = currentFrame;

Utilisez-le pour avoir plusieurs lignes de texte dans UILabel:

textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

Rapide:

textLabel.lineBreakMode = .byWordWrapping
textLabel.numberOfLines = 0
myUILabel.numberOfLines = 0;
myUILabel.text = @"your long string here";
[myUILabel sizeToFit];

Si vous devez utiliser le:

myLabel.numberOfLines = 0;

propriété Vous pouvez également utiliser une pause de ligne standard ("\n"), dans le code, pour forcer une nouvelle ligne.

Vous pouvez utiliser \r pour aller à la ligne suivante tout en remplissant le UILabel utilisant NSString.

UILabel * label;


label.text = [NSString stringWithFormat:@"%@ \r %@",@"first line",@"seconcd line"];

Essayons ça

textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated     
textLabel.numberOfLines = 0;                          
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

La solution ci-dessus ne fonctionne pas dans mon cas. Je fais comme ceci:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ...

    CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0] constrainedToSize:CGSizeMake(240.0, 480.0) lineBreakMode:UILineBreakModeWordWrap];
    return size.height + 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        // ...
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:@"Georgia-Bold" size:18.0];
    }

    // ...

    UILabel *textLabel = [cell textLabel];
    CGSize size = [text sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0]
                                        constrainedToSize:CGSizeMake(240.0, 480.0)
                                            lineBreakMode:UILineBreakModeWordWrap];

    cell.textLabel.frame = CGRectMake(0, 0, size.width + 20, size.height + 20);

    //...
}

Utilisez Story Borad: sélectionnez l'étiquette pour définir le nombre de lignes à zéro ......Ou référer ceci

enter image description here

Swift 3
Définissez le nombre de lignes zéro pour les informations de texte dynamique, il sera utile pour un texte variable.

var label = UILabel()
let stringValue = "A label\nwith\nmultiline text."
label.text = stringValue
label.numberOfLines = 0
label.lineBreakMode = .byTruncatingTail // or .byWrappingWord
label.minimumScaleFactor = 0.8 . // It is not required but nice to have a minimum scale factor to fit text into label frame

enter image description here

UILabel *helpLabel = [[UILabel alloc] init];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:label];
helpLabel.attributedText = attrString;
// helpLabel.text = label;

helpLabel.textAlignment = NSTextAlignmentCenter;
helpLabel.lineBreakMode = NSLineBreakByWordWrapping;
helpLabel.numberOfLines = 0;

Pour certaines raisons, cela ne fonctionne pas pour moi dans iOS 6 Je ne sais pas pourquoi. J'ai essayé avec et sans texte attribué. Aucune suggestion.

Essayez d'utiliser ceci:

lblName.numberOfLines = 0;
[lblName sizeToFit];

Vous devriez essayer ceci:

-(CGFloat)dynamicLblHeight:(UILabel *)lbl
{
    CGFloat lblWidth = lbl.frame.size.width;
    CGRect lblTextSize = [lbl.text boundingRectWithSize:CGSizeMake(lblWidth, MAXFLOAT)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                            attributes:@{NSFontAttributeName:lbl.font}
                                               context:nil];
    return lblTextSize.size.height;
}

Ces choses m'ont aidé

Changer ces propriétés d'Uilabel

label.numberOfLines = 0;
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByWordWrapping;

Et tout en donnant une chaîne d'entrée utilise n pour afficher différents mots dans différentes lignes.

Exemple :

 NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];

Vous pouvez également le faire via le storyboard:

  1. Sélectionnez l'étiquette sur le contrôleur de vue
  2. Dans l'inspecteur d'attribut, augmentez la valeur de l'option de ligne (appuyez sur alt + cmd + 4 pour afficher l'inspecteur des attributs)
  3. Double-cliquez sur l'étiquette dans le contrôleur de vue et écrivez ou collez votre texte
  4. Redimensionner l'étiquette et / ou augmenter la taille de la police afin que l'ensemble du texte puisse être affiché

Méthode 1:

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Maintenant, appelez simplement comme ça

myLbl.lblFunction()//Replace your label name 

EX:

Import UIKit

class MyClassName: UIViewController {//For example this is your class. 

    override func viewDidLoad() {
    super.viewDidLoad()

        myLbl.lblFunction()//Replace your label name 

    }

}//After close of your class write this extension.

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Méthode 2:

Par programme

yourLabel.numberOfLines = 0
yourLabel.lineBreakMode = .byWordWrapping//If you want word wraping
//OR
yourLabel.lineBreakMode = .byCharWrapping//If you want character wraping

Méthode 3:

Par le biais du story-conseil

Pour afficher plusieurs lignes SET 0 (zéro), cela affichera plus d'une ligne dans votre étiquette.

Si vous souhaitez afficher N lignes, définissez n.

Voir l'écran ci-dessous.

enter image description here

Si vous souhaitez définir la taille minimale de la police pour l'étiquette, cliquez sur AutoshRink et sélectionnez l'option de taille de police minimale

Voir les écrans ci-dessous

enter image description here

Ici définir la taille de la police minimale

Ex: 9 (dans cette image)

Si votre étiquette obtient plus de texte à ce moment-là, votre texte d'étiquette sera rétréci jusqu'à 9

enter image description here

UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";

Déjà répondu, mais vous pouvez également le faire manuellement dans le storyboard. Sous Inspecteur des attributs pour l'étiquette, vous pouvez changer les pauses de ligne en enveloppement de mots (ou enveloppement de caractère).

Dans cette fonction, passez la chaîne que vous souhaitez attribuer dans l'étiquette et passer la taille de la police à la place de l'auto-activitéfont et passer la largeur de l'étiquette à la place de 235, vous obtenez maintenant la hauteur de l'étiquette en fonction de votre chaîne. Cela fonctionnera bien.

-(float)calculateLabelStringHeight:(NSString *)answer
{
    CGRect textRect = [answer boundingRectWithSize: CGSizeMake(235, 10000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.activityFont} context:nil];
    return textRect.size.height;

}

Définir ci-dessous soit dans le code ou dans le storyboard lui-même

Label.LineBreakMode = nslineBreakBywordwapping; Label.numberoflines = 0;

Et n'oubliez pas de définir les contraintes à étiquette gauche, droite, supérieure et inférieure, sinon cela ne fonctionnera pas.

Swift 4:

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 0

label.translatesAutoresizingMaskIntoConstraints = false

label.preferredMaxLayoutWidth = superview.bounds.size.width - 10 

Sur C #, cela a fonctionné pour moi à l'intérieur d'UitableViewcell.

        UILabel myLabel = new UILabel();
        myLabel.Font = UIFont.SystemFontOfSize(16);
        myLabel.Lines = 0;
        myLabel.TextAlignment = UITextAlignment.Left;
        myLabel.LineBreakMode = UILineBreakMode.WordWrap;
        myLabel.MinimumScaleFactor = 1;
        myLabel.AdjustsFontSizeToFitWidth = true;

       myLabel.InvalidateIntrinsicContentSize();
       myLabel.Frame = new CoreGraphics.CGRect(20, mycell.ContentView.Frame.Y + 20, cell.ContentView.Frame.Size.Width - 40, mycell.ContentView.Frame.Size.Height);
       myCell.ContentView.AddSubview(myLabel);

Je pense que le point ici est: -

            myLabel.TextAlignment = UITextAlignment.Left;
            myLabel.LineBreakMode = UILineBreakMode.WordWrap;
            myLabel.MinimumScaleFactor = 1;
            myLabel.AdjustsFontSizeToFitWidth = true;

Ce code renvoie la taille de la taille selon le texte

+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font
 {
    CGFloat result = font.pointSize+4;
    if (text) 
{
        CGSize size;

        CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, 999)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil];
        size = CGSizeMake(frame.size.width, frame.size.height+1);
        result = MAX(size.height, result); //At least one row
    }
    return result;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top