Неверный размер UILabel для одной строки текста с межстрочным интервалом и несколькими цветами

Я почти уверен, что на самом деле это ошибка UIKit, но хочу получить некоторую информацию, чтобы увидеть, не упустил ли я здесь что-то глупое.

Вот код, который у меня есть:

// single line with modified line spacing and 2 colors - broken, line spacing is added to the bottom!
UILabel *brokenLabel = [[UILabel alloc] init];
brokenLabel.backgroundColor = [UIColor greenColor];

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"Just some text"];

[attributedString addAttributes:@{NSForegroundColorAttributeName : [UIColor redColor]} range:[attributedString.string rangeOfString:@"text"]];

attributedString = attributedStringFromAttributedStringWithLineSpacing(attributedString, 20, NSTextAlignmentCenter);

brokenLabel.attributedText = attributedString;
[brokenLabel sizeToFit];
brokenLabel.frame = CGRectOffset(brokenLabel.frame, 50, 100);
[self.view addSubview:brokenLabel];
// end

// single line with modified line spacing and 1 color - correct
UILabel *workingLabel = [[UILabel alloc] init];
workingLabel.backgroundColor = [UIColor greenColor];

attributedString = [[NSMutableAttributedString alloc] initWithString:@"Just some text"];

attributedString = attributedStringFromAttributedStringWithLineSpacing(attributedString, 20, NSTextAlignmentCenter);

workingLabel.attributedText = attributedString;
[workingLabel sizeToFit];
workingLabel.frame = CGRectOffset(workingLabel.frame, 200, 100);
[self.view addSubview:workingLabel];
//end

// multiple lines with modified line spacing and 1 color - correct
UILabel *workingLabel2 = [[UILabel alloc] init];
workingLabel2.frame = CGRectMake(0, 0, 100, 0);
workingLabel2.numberOfLines = 0;
workingLabel2.backgroundColor = [UIColor greenColor];

attributedString = [[NSMutableAttributedString alloc] initWithString:@"Just some text"];

attributedString = attributedStringFromAttributedStringWithLineSpacing(attributedString, 20, NSTextAlignmentCenter);

workingLabel2.attributedText = attributedString;
[workingLabel2 sizeToFit];
workingLabel2.frame = CGRectOffset(workingLabel2.frame, 50, 300);
[self.view addSubview:workingLabel2];
//end

// multiple lines with modified line spacing and 2 color - correct
UILabel *workingLabel3 = [[UILabel alloc] init];
workingLabel3.frame = CGRectMake(0, 0, 100, 0);
workingLabel3.numberOfLines = 0;
workingLabel3.backgroundColor = [UIColor greenColor];

attributedString = [[NSMutableAttributedString alloc] initWithString:@"Just some text"];

[attributedString addAttributes:@{NSForegroundColorAttributeName : [UIColor redColor]} range:[attributedString.string rangeOfString:@"text"]];

attributedString = attributedStringFromAttributedStringWithLineSpacing(attributedString, 20, NSTextAlignmentCenter);

workingLabel3.attributedText = attributedString;
[workingLabel3 sizeToFit];
workingLabel3.frame = CGRectOffset(workingLabel3.frame, 200, 300);
[self.view addSubview:workingLabel3];

вместе с простой удобной функцией для изменения lineSpacing строки с атрибутами:

NSMutableAttributedString *attributedStringFromAttributedStringWithLineSpacing(NSAttributedString *string, CGFloat lineSpacing, NSTextAlignment textAlignment)
{
    NSMutableAttributedString *mutable = string.mutableCopy;
    
    NSMutableParagraphStyle *par = [NSMutableParagraphStyle new];
    par.alignment = textAlignment;
    par.lineSpacing = lineSpacing;
    [mutable addAttributes:@{NSParagraphStyleAttributeName : par} range:NSMakeRange(0, mutable.length)];
    return mutable;
}

Однако вот как это выглядит

изображение

Как вы можете видеть, высота первой метки слишком велика (или высота, которая должна быть + мой пользовательский межстрочный интервал, если быть точным). При простом добавлении другого цвета к первой атрибутированной строке размер sizeToFit увеличивается за счет добавления lineSpacing под ним. Я также пытался напрямую использовать методы boundingRectWithSize: для строк, и та же проблема видна. Таким образом, это не связано с кодом размера этикетки, а связано с самими строками. Я не вижу никакой возможной причины, по которой это должно происходить. У кого-нибудь есть понимание?


person Dima    schedule 10.05.2014    source источник
comment
И если вы не добавите пользовательский межстрочный интервал в первом примере, какой будет рамка?   -  person sha    schedule 10.05.2014
comment
Он отлично работает без пользовательского межстрочного интервала, или, по крайней мере, выглядит так. Я подозреваю, что он все еще пытается добавить его внизу, но, поскольку значение равно 0, это не будет иметь реального эффекта и будет выглядеть нормально.   -  person Dima    schedule 11.05.2014
comment
ты решил это? FWIW UITextView вообще не имеет этой проблемы   -  person bogardon    schedule 16.09.2016
comment
Я только что запустил свой старый пример проекта с Xcode 8.0 (8A218a) и симом iOS 10, и проблема все еще присутствует. Мой радар также все еще открыт без обновлений.   -  person Dima    schedule 16.09.2016


Ответы (1)


В свой словарь атрибутов добавьте

 [attrDic setObject:@0 forKey:NSBaselineOffsetAttributeName];
person Jone Zhu    schedule 31.03.2016
comment
Я пробовал это в нескольких разных местах, и, к сожалению, это ничего не дает. Можете ли вы уточнить, где или как я должен установить этот атрибут, поскольку он относится именно к моему коду? Вы пробовали это с кодом, который я предоставил выше? - person Dima; 31.03.2016