Existe-t-il un moyen d'avoir plusieurs lignes de texte UILabel
comme dans le UITextView
ou dois-je utiliser la deuxième à la place?
Existe-t-il un moyen d'avoir plusieurs lignes de texte UILabel
comme dans le UITextView
ou dois-je utiliser la deuxième à la place?
Réponses:
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;
Ancienne réponse restaurée (pour référence et les développeurs souhaitant prendre en charge iOS en dessous de 6.0):
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;
Sur le côté: les deux valeurs enum cèdent 0
quand même.
cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
etcell.textLabel?.numberOfLines = 0
Dans IB, définissez le nombre de lignes sur 0 (autorise un nombre illimité de lignes)
Lorsque vous tapez dans le champ de texte en utilisant IB, utilisez "alt-return" pour insérer un retour et passez à la ligne suivante (ou vous pouvez copier du texte déjà séparé par des lignes).
La meilleure solution que j'ai trouvée (à un problème autrement frustrant qui aurait dû être résolu dans le cadre) est similaire à celle de vaychick.
Définissez simplement le nombre de lignes à 0 dans IB ou dans le code
myLabel.numberOfLines = 0;
Cela affichera les lignes nécessaires mais repositionnera l'étiquette de manière à ce qu'elle soit centrée horizontalement (de sorte qu'une étiquette de 1 ligne et de 3 lignes soient alignées dans leur position horizontale). Pour corriger cela, 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;
myUILabel.numberOfLines = 0;
myUILabel.text = @"your long string here";
[myUILabel sizeToFit];
Si vous devez utiliser:
myLabel.numberOfLines = 0;
, vous pouvez également utiliser un saut de ligne standard ("\n")
, dans le code, pour forcer une nouvelle ligne.
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 ça:
- (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 reportez-vous à ceci
Swift 3
Définissez le nombre de lignes zéro pour les informations de texte dynamique, il sera utile pour varier le texte.
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
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. Je l'ai essayé avec et sans texte attribué. Aucune suggestion.
Essayez d'utiliser ceci:
lblName.numberOfLines = 0;
[lblName sizeToFit];
Ces choses m'ont aidé
Modifier ces propriétés de UILabel
label.numberOfLines = 0;
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByWordWrapping;
Et lors de la saisie de la chaîne, utilisez \ n pour afficher différents mots sur différentes lignes.
Exemple :
NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;
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 de Story board
Pour afficher plusieurs lignes définies sur 0 (zéro), cela affichera plusieurs lignes dans votre étiquette.
Si vous souhaitez afficher n lignes, définissez n.
Voir l'écran ci-dessous.
Si vous souhaitez définir la taille de police minimale pour l'étiquette Cliquez sur l'option Rétrécissement automatique et sélectionnez la taille de police minimale
Voir les écrans ci-dessous
Définissez ici la taille de police minimale
EX: 9 (dans cette image)
Si votre étiquette obtient plus de texte à ce moment-là, le texte de votre étiquette sera réduit jusqu'à 9
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:
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;
}
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";
Dans cette fonction, passez la chaîne que vous souhaitez attribuer à l'étiquette et passez la taille de la police à la place de self.activityFont et passez 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éfinissez ci-dessous dans le code ou dans le storyboard lui-même
Label.lineBreakMode = NSLineBreakByWordWrapping; Label.numberOfLines = 0;
et n'oubliez pas de définir les contraintes gauche, droite, haut et bas pour l'étiquette 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 dans 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 en fonction du 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;
}
UILineBreakModeWordWrap
option est déconseillée dans iOS 6. Vous devez maintenant utiliserNSLineBreakByWordWrapping = 0
Voir la documentation ici