设置uilabel的最大行数

时间:2011-11-19 23:23:54

标签: iphone objective-c cocoa-touch

我需要与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).

5 个答案:

答案 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自动定义。