Подтвердить что ты не робот

Установить максимальное количество строк в uilabel

Мне нужно выполнить специальное выравнивание с 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:
проверьте это примерное приложение, чтобы просмотреть мою проблему (надеюсь).

4b9b3361

Ответ 1

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);

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Вызвать 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;
}