установить максимальное количество строк в uilabel - PullRequest
20 голосов
/ 20 ноября 2011

Мне нужно сделать какое-то специальное выравнивание с помощью 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 пунктов, если она немного длиннее, она расширяется.

теперь я хочу, чтобы к тексту добавлялись значения по умолчанию ... тройные точки, если текст становится слишком длинным для трех строк, но с настройкой сверху он расширяется до четвертой строки.

Кто-нибудь знает, как этого добиться?

Пожалуйста, оставьте комментарий, если что-то неясно.

Edit:
проверьте этот пример приложения, чтобы просмотреть мою проблему (надеюсь).

Ответы [ 4 ]

19 голосов
/ 20 ноября 2011
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);
16 голосов
/ 20 ноября 2011

Просто установите label.numberOfLines = 3;.

Это несколько неправильно обозначено, так как фактически содержит максимальное количество отображаемых строк.

2 голосов
/ 14 апреля 2015

Я думал, что попробую:

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

0 голосов
/ 20 ноября 2011

Звоните 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...