Используйте sizeToFit с lineSpacing

У меня есть UILabel с несколькими строками. Текст устанавливается динамически, как и высота моей метки, с помощью этого собственного метода:

[myLabel sizeToFit];

У меня есть другой метод, который устанавливает межстрочный интервал в моей метке:

    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"My long dynamic text"];
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [paragraphStyle setLineSpacing:5];
    [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];


myLabel.attributedText = attributedString;

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

Это действительно проблема, так как моя метка находится в UIScrollView, и мне нужна правильная высота.


person Nicolas Roy    schedule 24.03.2014    source источник
comment
возможный дубликат UILabel sizeToFit/sizeThatFits игнорирует свойство numberoflines   -  person André Dion    schedule 24.03.2014
comment
Нет, мое свойство numberOfLines не игнорируется. Он установлен на 0 и работает отлично. Я говорю здесь о высоте строки, межстрочном интервале, называйте это как хотите.   -  person Nicolas Roy    schedule 24.03.2014


Ответы (2)


Для динамического получения размера метки на основе длины текста используйте этот метод:

/*! Returns the size of the label to display the text provided
    @param text
        The string to be displayed
    @param width
        The width required for displaying the string
    @param fontName
        The font name for the label
    @param fontSize
        The font size for the label
 */
- (CGSize)getSizeForText:(NSString *)text maxWidth:(CGFloat)width font:(NSString *)fontName fontSize:(float)fontSize {
    CGSize constraintSize;
    constraintSize.height = MAXFLOAT;
    constraintSize.width = width;
    NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                          [UIFont fontWithName:fontName size:fontSize], NSFontAttributeName,
                                          nil];

    CGRect frame = [text boundingRectWithSize:constraintSize
                                      options:NSStringDrawingUsesLineFragmentOrigin
                                   attributes:attributesDictionary
                                      context:nil];

    CGSize stringSize = frame.size;
    return stringSize;
}
person Sujith Thankachan    schedule 26.03.2014
comment
Думаю, это лучший ответ... но я разочарован, что sizeToFit не учитывает атрибуты. Это не имеет для меня никакого смысла. - person Nicolas Roy; 01.04.2014

Попробуйте использовать – boundingRectWithSize:options:context: метод NSMutableAttributedString. См. Документы Apple для получения дополнительной информации.

person Adithya    schedule 24.03.2014