it-swarm.com.ru

NSParagraphStyle межстрочный интервал игнорируется

Простой тест, который не удался: создайте новый проект только с одним подпредставлением (UITextView) и добавьте следующее:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineHeightMultiple = 50.f;
    paragraphStyle.lineSpacing = 100.f;
    paragraphStyle.minimumLineHeight = 200.f;
    paragraphStyle.maximumLineHeight = 500.f;

    UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:24.f];

    self.textView.attributedText = [[NSAttributedString alloc] initWithString:
    @"This is a test.\n Will I pass?" attributes:
    @{NSParagraphStyleAttributeName : paragraphStyle, NSFontAttributeName : font}];
}

Межстрочный интервал такой же, как если бы атрибута не было. Что-нибудь заставило это работать успешно? Я ввел нелепые цифры, чтобы показать, что это не изменится ...

23
borrrden

Это ошибка в NSHTMLWriter, который является закрытым классом, который UITextView использует для преобразования attribuText в HTML. Внутренне он отображает этот HTML через UIWebDocumentView. Узнайте больше о внутренней работе UITextView в моей статье здесь: http://www.cocoanetics.com/2012/12/uitextview-caught-with-trousers-down/

Проблема заключается в том, что шрифт CSS легко пропустить. Если вы укажете размер пикселя с помощью сокращения шрифта, тогда будет установлен ОБА как размера шрифта, так и высоты строки. Поскольку NSHTMLWriter помещает шрифт ПОСЛЕ высоты строки, это приводит к уменьшению высоты строки размером шрифта.

Смотрите здесь для моего радара, который включает в себя полный анализ ошибки: http://www.cocoanetics.com/2012/12/radar-uitextview-ignores-minimummaximum-line-height-in-attributed-string/

Я предлагаю вам также сообщить об ошибке и упомянуть мой радар # 12863734.

24
Cocoanetics

Я не знаю, достаточно ли этого для ваших целей, но я мог бы отрегулировать межстрочный интервал, установив минимальную и максимальную высоту строки. Кроме того, чтобы использовать шрифт, я помещаю его в свойство font текстового представления, а не передаю его как значение NSFontAttributeName в словаре атрибутов. (Может быть, эта часть не (хорошо) задокументирована?)

О ваших атрибутах

lineSpacing рассчитывается от нижней части строки до нижней части верхней строки, и это пространство ограничено значениями между minimumLineHeight и miximumLineHeight. Я пытаюсь сказать, что, возможно, некоторые значения в ваших атрибутах отменяют или отменяют другие.

Также, если вам нужно просто настроить расстояние между строками, вам, вероятно, не нужно использовать paragraphStyle.lineHeightMultiple :)

Код

Это сработало для меня:

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.minimumLineHeight = 35.f;
paragraphStyle.maximumLineHeight = 35.f;

UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:18.f];
NSString *string = @"This is a test.\nWill I pass?\n日本語のもじもあるEnglish\nEnglish y Español";
NSDictionary *attributtes = @{
    NSParagraphStyleAttributeName : paragraphStyle,
};
self.textView.font = font;
self.textView.attributedText = [[NSAttributedString alloc] initWithString:string
                                 attributes:attributtes];

Дополнительные примечания

Кажется, есть ситуация с японским/китайским и, возможно, другими символами, смешанными с символами алфавита в той же строке. Это сделает эту строку более крупной ведущей, чтобы решить, что вам нужно установить минимальную и максимальную высоту строки, как я сделал .. Вы можете увидеть проблему при рендеринге моего примера без атрибутов.

23
nacho4d

Установка MaximumLineHeight, кажется, решает эту проблему для меня;

CGFloat fontSize = 22.f;
titleLabel.font = [UIFont boldSystemFontOfSize:fontSize];
NSMutableParagraphStyle *paragraphStyle = [[[NSMutableParagraphStyle  alloc] init] autorelease];
paragraphStyle.maximumLineHeight = fontSize/2;
titleLabel.attributedText = [[[NSAttributedString alloc]
                              initWithString:@"This is a test.\nWill I pass?"
                              attributes: @{ NSParagraphStyleAttributeName : paragraphStyle,
                                             NSFontAttributeName : titleLabel.font}]
                             autorelease];

overlapping lines

8
Henrik Hartz

Для этой конкретной строки вам нужно установить paragraphSpacing вместо этого. Что касается lineSpacing, я думаю, что он пока не поддерживается на iOS.

5
pronvit

В моем случае ни один из стилей абзаца не работал. Исправление состояло в том, чтобы установить приписанный текст на метке ПОСЛЕ выполнения каких-либо настроек рамки на метке. :)

0
Erik Villegas

Как ответил nacho4d, в iOS 6 вам нужно использовать-imumLineHeight и MaximumLineHeight и установить шрифт непосредственно в UITextView , а не в NSAttributedString как высота строки в этом случае будет переопределено 

Обратите внимание, что когда вы устанавливаете шрифт в UITextView , "редактируемый" свойство UITextView должен быть установлен вДА, в другом случае атрибутивный текст не будет затронут.

Эти проблемы присутствуют только в iOS 6 . В iOS 7 и выше все ок;

0
Hordaric