我需要与uilabel做一些特殊的调整。
我希望它有1到3行,无论它有什么内容。 目前我正在做这样的事情
label.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:14.0f];
label.backgroundColor = [UIColor clearColor];
label.numberOfLines = 0;
label.lineBreakMode = UILineBreakModeWordWrap;
label.frame = CGRectMake(114.0f, 88.0f, 187.0f, 0.0f);
[label sizeToFit];
如果文字不太长,效果很好。如果字符串类似于@"Hello World"
,则UILabel只有14个点高,如果它长一些,它会扩展。
现在我想要文本应该添加它的默认...
三重点,如果文本对于三行来说太长,但是设置在顶部它会扩展到第四行。
有人知道如何实现这个目标吗?
如果不清楚,请发表评论。
修改
check out this sample application to view my problem (hopefully).
答案 0 :(得分:19)
label.numberOfLines = 3;
CGSize size = [label.text sizeWithFont:label.font
constrainedToSize:CGSizeMake(SOME_WIDTH,
3 * label.font.lineHeight)
lineBreakMode:UILineBreakModeWordWrap];
label.bounds = CGRectMake(0, 0,
size.width,
size.height);
答案 1 :(得分:16)
只需设置label.numberOfLines = 3;
。
它有点贴错标签,因为它实际上包含要显示的最大行数。
答案 2 :(得分:2)
我以为我会尝试一下:
func heightForStringDrawing(myString: String, myFont:UIFont, myWidth:CGFloat) -> (CGFloat, Int) {
var tc = NSTextContainer(size: CGSize(width: myWidth, height:CGFloat(FLT_MAX)))
var ts = NSTextStorage(string: myString)
var lm = NSLayoutManager()
lm.addTextContainer(tc)
ts.addLayoutManager(lm)
ts.addAttribute(NSFontAttributeName, value: myFont, range: NSMakeRange(0, ts.length))
tc.lineFragmentPadding = 0.0
lm.glyphRangeForTextContainer(tc)
let height = lm.usedRectForTextContainer(tc).height
let lines = Int(Float(height / myFont.lineHeight))
return (height, lines)
}
评论肯定是受欢迎的!我采用了这个: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html
答案 3 :(得分:0)
致电getStringSize
。它将返回StringSize
类型的变量并动态决定行数。
struct StringSize {
int numberOfLine;
float height;
float width;
};
typedef struct StringSize StringSize;
+(StringSize)getStringSize:(NSString *)string ofWidth:(float)width FontSize:(id)font {
StringSize sizeForString;
if(string){
CGSize size = CGSizeMake(width, 400.0f);
CGSize appStringSize = [string sizeWithFont:(UIFont *)font constrainedToSize:size lineBreakMode:UILineBreakModeTailTruncation];
CGSize sizeString = [string sizeWithFont:font];
sizeForString.width = appStringSize.width;
sizeForString.height = appStringSize.height;
sizeForString.numberOfLine = (int)(sizeForString.height/sizeString.height);
}else {
sizeForString.width = 0;
sizeForString.height = 0;
sizeForString.numberOfLine = 0;
}
return sizeForString;
}
答案 4 :(得分:0)
这似乎对我有用(使用自动布局):
label.numberOfLines = 0
// max height for 3 lines, this value worked for me
// you can try a slightly larger value if needed
let heightLimit = label.font.lineHeight * 3 + 0.5
label.heightAnchor.constraint(lessThanOrEqualToConstant: heightLimit).isActive = true
这个想法是通过lessThanOrEqual
关系来限制高度。如果文本足够小,那么高度将由标签的sizeToFit
自动定义。