如何用文本动态地打破UILabel的行?

时间:2017-03-14 05:06:43

标签: ios uilabel ios10

我有一个UILabel,我想在这个标签中显示一些文字。我想将标签宽度增加到设备全屏的70%。如果该标签的文本长度不适合这个70%的大小,那么只要文本长度,标签就会自动转到下一行。每当标签长度超过主屏幕的70%宽度时,线条也会断开。我尝试了几种方法,但还没有解决。请帮我解决这个问题。

提前致谢;

4 个答案:

答案 0 :(得分:2)

足够简单:)

将标签拖到故事板并向其添加顶部和前导约束。

现在选择标签并控制拖动到包含标签的视图(在ViewController的案例视图中),您将看到弹出窗口,然后选择等宽

enter image description here

现在,您的标签宽度等于您的视图宽度:)这不是您希望您希望标签宽度为视图的70%。因此,选择标签的相等约束,转到属性检查器并将乘数更改为0.7

enter image description here

现在您的标签宽度是您视图的70%!

但是你不希望它总是70%:)它可以是屏幕的最大70%,所以 现在改变约束关系等于或小于等于:)

enter image description here

选择标签并将行数更改为0。

多数民众赞成:)玩得开心:))

样本O / P:

文字很小时: enter image description here

当文字更多时: enter image description here

修改

不使用故事板!不是问题以编程方式编写相同的约束并将其应用于标签足够简单:)需要帮助lemme知道:)

修改

正如您已指定要在标签中的每一行的开头留下间隙,您可以使用Edge insets来实现它

- (void)drawTextInRect:(CGRect)rect {
    UIEdgeInsets insets = {0, 5, 0, 0};
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}

答案 1 :(得分:2)

您必须忘记增加标签的高度。 下面的代码用于允许UILabel有多行:

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

然后你必须确保UILabel的框架有足够的高度来显示线条。您可以通过计算给定文本(NSString)所需的高度来实现此目的:

NSString *text = @"YourText";
CGFloat your70Width; // whatever your width is
CGSize constraintSize = CGSizeMake(your70Width, MAXFLOAT);
UIFont *yourLabelFont; // whatever your font is
CGRect requiredFrame = [text boundingRectWithSize:constraintSize options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:yourLabelFont} context:nil];

// Keeps the old x,y coordinates and replaces only the width and height.
CGRect oldLabelFrame = label.frame;
label.frame = CGRectMake(oldLabelFrame.origin.x, oldLabelFrame.origin.y, requiredFrame.size.width, requiredFrame.size.height);

现在标签将很好地显示在多行中。

答案 2 :(得分:2)

如果您使用的是故事板,则根据内容增加标签的高度。给出标签FOUR约束(Top,Bottom,Leading,Trailing)然后转到Attribute Inspector并将行设为0并在换行符中执行WORD WRAP。enter image description here

答案 3 :(得分:0)

let lbl = UILabel()
lbl.numberOfLines = 0
lbl.lineBreakMode = .ByWordWrapping