2009-06-13 91 views
393

有没有办法让UILabel中有多行文字,就像UITextView一样,还是应该用第二行代替?UILabel中有多行文字

+0

检查这个问题 http://stackoverflow.com/questions/2312899/how-to-add-line-break-for-uilabel – user1766342 2013-02-13 07:17:56

+2

注意`UILineBreakModeWordWrap`在iOS 6中已被弃用。现在应该使用'NSLineBreakByWordWrapping = 0`请参阅文档[here](http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSParagraphStyle_Class/Reference /Reference.html#//apple_ref/c/tdef/NSLineBreakMode) – Austin 2012-10-03 01:03:21

回答

720

我找到了解决方案。

一只是必须添加以下代码:

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

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

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

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

恢复旧的答案(供参考和开发者愿意支持低于6.0的iOS):

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

在侧面:既枚举值无论如何,收益率为0

+15

UILineBreakModeWordWrap实际上是默认的,所以你不需要冷杉st line。 – 2012-07-30 18:23:36

+3

不适用于iOS 6.1。 – dbarros 2013-10-03 01:27:45

+1

对于那些使用swift:`cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping`和`cell.textLabel?.numberOfLines = 0` – boidkan 2014-10-21 19:53:33

121

IB,在设置的行数为0(允许无限行)

当使用IB文本字段中键入,使用“ALT-回归”插入返回并转到下一行(或你可以复制已经由行分隔出来的文本)。

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

上述解决方案在我的情况下不起作用。我在做这样的:

- (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); 

    //... 
} 
49

我已经找到了最好的解决方案(以本应在框架内解决的,否则令人沮丧的问题)类似于vaychick的。

只需设置在任一IB线为0或代码

myLabel.numberOfLines = 0; 

的数目这将显示所需的线,但将重新定位的标签,以便其水平居中(使得1线和3线标签对齐在他们的水平位置)。为了解决这个问题加:

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; 
15

如果你必须使用:

myLabel.numberOfLines = 0; 

属性你也可以使用一个标准的换行符("\n"),在代码中,强制新生产线。

13

您可以使用\r转到下一行,同时使用NSString填写UILabel

UILabel * label; 


label.text = [NSString stringWithFormat:@"%@ \r %@",@"first line",@"seconcd line"]; 
19
myUILabel.numberOfLines = 0; 
myUILabel.text = @"your long string here"; 
[myUILabel sizeToFit]; 
6
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; 

对于一些原因,它不是在iOS 6中不知道为什么为我工作。尝试使用和不使用归因文本。有什么建议么。

30

使用此拥有多行文本在UILabel

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

斯威夫特:

textLabel.lineBreakMode = .byWordWrapping 
textLabel.numberOfLines = 0 
11

可以试试这个

textLabel.lineBreakMode = UILineBreakModeWordWrap;   

textLabel.numberOfLines = 0;       
1
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)]; 
[textLabel sizeToFit]; 
textLabel.numberOfLines = 0; 
textLabel.text = @"Your String..."; 
2
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)]; 
[labelName sizeToFit]; 
labelName.numberOfLines = 0; 
labelName.text = @"Your String..."; 
[self.view addSubview:labelName]; 
5
Try using this code: 

lblName.numberOfLines = 0; 
[lblName sizeToFit]; 
2

你可以做到这一点通过故事板太:

  1. 选择视图控制器
  2. 在属性检查器上的标签,增加线路选项的值(按Alt + Cmd的+ 4显示属性检查器)
  3. 双击视图控制器中的标签并写入或粘贴文本
  4. 调整标签大小和/或增加字体大小以便显示整个文本
1

已经回答,但您也可以在故事板中手动执行此操作。在标签的属性检查器下,可以将换行符更改为换行符(或字符换行)。

1

在这个函数中,您要在标签中分配字符串,并通过字体大小代替self.activityFont并通过标签宽度代替235,现在您可以根据字符串获取标签高度。 它会正常工作。

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

} 
-1

此代码是根据文本

+ (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; 
} 
2

我震动奥尔森同意,NSLineBreakByWordWrapping返回尺寸高度默认。 我添加了财产sizeToFit像Gurumoorthy Arumugam指导修复它。

如果您想让标签内的字体自行调整以适应标签的边界。您可以使用:

textLabel.adjustsFontSizeToFitWidth = YES; 

谢谢大家。

3

你应该试试这个:

-(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; 
} 
0

设置如下无论是在代码或故事板本身

Label.lineBreakMode = NSLineBreakByWordWrapping; 标签。numberOfLines = 0;

请不要忘记为标签设置左,右,上,下约束,否则不起作用。线的

1

夫特3
集数为零动态文本信息,这将是用于改变文本有用的。

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

3

这些东西让我

变化的UILabel

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

的这些属性和同时也让输入字符串使用\ n显示在不同线路不同的话。

例子:

NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;