UILabel 自动换行
UILabel word wrapping
我将 UILabel 设置为最多 2 行,当内容过多时自动换行。
我遇到一个问题,当只剩下一个单词时,它不会自动换行并截断文本。
无论余数多长,我怎样才能让它换行所有文本?
(下面第一个例子只漏'aves'
1.Calculate标签的高度使用下面的代码片段
-(float) getHeightForText:(NSString*) text withFont:(UIFont*) font andWidth:(float) width{
CGSize constraint = CGSizeMake(width , 20000.0f);
CGSize title_size;
float totalHeight;
SEL selector = @selector(boundingRectWithSize:options:attributes:context:);
if ([text respondsToSelector:selector]) {
title_size = [text boundingRectWithSize:constraint
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{ NSFontAttributeName : font }
context:nil].size;
totalHeight = ceil(title_size.height);
} else {
title_size = [text sizeWithFont:font
constrainedToSize:constraint
lineBreakMode:NSLineBreakByWordWrapping];
totalHeight = title_size.height ;
}
CGFloat height = MAX(totalHeight, 40.0f);
return height;
}
2.Create 像这样的标签
UILabel *YourLabel = [[UILabel alloc] init];
YourLabel.numberOfLines = 0;
YourLabel.lineBreakMode = NSLineBreakByWordWrapping;
CGRect frame = YourLabel.frame;
float height = [self getHeightForText:YourLabel.text
withFont:YourLabel.font
andWidth:YourLabel.frame.size.width];
float gap = 2;
YourLabel.frame = CGRectMake(frame.origin.x,
frame.origin.y,
frame.size.width,
height);
希望对您有所帮助
Attribution
您遗漏了一些信息,所以这基本上是一个很有根据的猜测:
我假设您为此使用了自动布局(可能应该标记它)。
如果您将标签的 preferredMaxLayoutWidth
设置为比实际使用的值更高的值,则可能会导致您看到的行为。
我试了一下,现在可以重现结果了。
如你所见(点击它),我在第13行将preferredMaxLayoutWidth
设置为310。但是标签的实际宽度是299点(第36行)。
Autolayout 引擎将使用 310 而不是 299 来计算需要多少行。第一个字符串适合 310 pt 的行。宽,第二个字符串没有。这就是为什么只有第一个标签中的文本被截断的原因。
解决方法是不设置preferredMaxLayoutWidth
。不过,这可能会对性能产生影响或产生任何其他负面后果。在这种情况下,您必须想办法将其设置为正确的值。
这是完整的游乐场,如果有人想玩的话:
// Playground - noun: a place where people can play
import UIKit
var view = UIView(frame: CGRect(x: 0, y: 0, width: 315, height: 200))
view.backgroundColor = UIColor.lightGrayColor()
func addLabel(view: UIView) -> UILabel {
let label1 = UILabel()
label1.numberOfLines = 0
label1.backgroundColor = UIColor.redColor().colorWithAlphaComponent(0.1)
label1.setTranslatesAutoresizingMaskIntoConstraints(false)
// label1.preferredMaxLayoutWidth = 310
view.addSubview(label1)
return label1
}
let label1 = addLabel(view)
let label2 = addLabel(view)
let views = ["l1" : label1, "l2" : label2]
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[l1]-8-[l2]", options: nil, metrics: nil, views: views))
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[l1]-|", options: nil, metrics: nil, views: views))
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[l2]-|", options: nil, metrics: nil, views: views))
label1.text = "How to Wear This Spring's Must-Haves"
label2.text = "The Best New Men's Fragrances For Spring 2015"
view.layoutIfNeeded()
view.frame
label1.frame
label1.preferredMaxLayoutWidth
label2.frame
label2.preferredMaxLayoutWidth
我将 UILabel 设置为最多 2 行,当内容过多时自动换行。
我遇到一个问题,当只剩下一个单词时,它不会自动换行并截断文本。
无论余数多长,我怎样才能让它换行所有文本?
(下面第一个例子只漏'aves'
1.Calculate标签的高度使用下面的代码片段
-(float) getHeightForText:(NSString*) text withFont:(UIFont*) font andWidth:(float) width{
CGSize constraint = CGSizeMake(width , 20000.0f);
CGSize title_size;
float totalHeight;
SEL selector = @selector(boundingRectWithSize:options:attributes:context:);
if ([text respondsToSelector:selector]) {
title_size = [text boundingRectWithSize:constraint
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{ NSFontAttributeName : font }
context:nil].size;
totalHeight = ceil(title_size.height);
} else {
title_size = [text sizeWithFont:font
constrainedToSize:constraint
lineBreakMode:NSLineBreakByWordWrapping];
totalHeight = title_size.height ;
}
CGFloat height = MAX(totalHeight, 40.0f);
return height;
}
2.Create 像这样的标签
UILabel *YourLabel = [[UILabel alloc] init];
YourLabel.numberOfLines = 0;
YourLabel.lineBreakMode = NSLineBreakByWordWrapping;
CGRect frame = YourLabel.frame;
float height = [self getHeightForText:YourLabel.text
withFont:YourLabel.font
andWidth:YourLabel.frame.size.width];
float gap = 2;
YourLabel.frame = CGRectMake(frame.origin.x,
frame.origin.y,
frame.size.width,
height);
希望对您有所帮助
Attribution
您遗漏了一些信息,所以这基本上是一个很有根据的猜测:
我假设您为此使用了自动布局(可能应该标记它)。
如果您将标签的 preferredMaxLayoutWidth
设置为比实际使用的值更高的值,则可能会导致您看到的行为。
我试了一下,现在可以重现结果了。
如你所见(点击它),我在第13行将preferredMaxLayoutWidth
设置为310。但是标签的实际宽度是299点(第36行)。
Autolayout 引擎将使用 310 而不是 299 来计算需要多少行。第一个字符串适合 310 pt 的行。宽,第二个字符串没有。这就是为什么只有第一个标签中的文本被截断的原因。
解决方法是不设置preferredMaxLayoutWidth
。不过,这可能会对性能产生影响或产生任何其他负面后果。在这种情况下,您必须想办法将其设置为正确的值。
这是完整的游乐场,如果有人想玩的话:
// Playground - noun: a place where people can play
import UIKit
var view = UIView(frame: CGRect(x: 0, y: 0, width: 315, height: 200))
view.backgroundColor = UIColor.lightGrayColor()
func addLabel(view: UIView) -> UILabel {
let label1 = UILabel()
label1.numberOfLines = 0
label1.backgroundColor = UIColor.redColor().colorWithAlphaComponent(0.1)
label1.setTranslatesAutoresizingMaskIntoConstraints(false)
// label1.preferredMaxLayoutWidth = 310
view.addSubview(label1)
return label1
}
let label1 = addLabel(view)
let label2 = addLabel(view)
let views = ["l1" : label1, "l2" : label2]
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[l1]-8-[l2]", options: nil, metrics: nil, views: views))
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[l1]-|", options: nil, metrics: nil, views: views))
view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[l2]-|", options: nil, metrics: nil, views: views))
label1.text = "How to Wear This Spring's Must-Haves"
label2.text = "The Best New Men's Fragrances For Spring 2015"
view.layoutIfNeeded()
view.frame
label1.frame
label1.preferredMaxLayoutWidth
label2.frame
label2.preferredMaxLayoutWidth