Установка шрифта в NSAttributedString в UITextView игнорирует межстрочный интервал
Я пытаюсь установить атрибутную строку в UITextView в iOS 6. Проблема в том, что если я попытаюсь установить свойство font в атрибутной строке, интервал между линиями будет проигнорирован. Однако, если я не устанавливаю шрифт, а используется шрифт по умолчанию, то работает интервал между строками.
NSString *string = @" Hello \n world";
attrString = [[NSMutableAttributedString alloc] initWithString:string];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
paragraphStyle.minimumLineHeight = 50;
// setting the font below makes line spacing become ignored
[attrString addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:20] range:NSMakeRange(0, string.length)];
[attrString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, string.length)];
mainTextView.attributedText = attrString;
Любая идея, что происходит?
Ответы
Ответ 1
Руководство по программированию с атрибутами String:
UIFont *font = [UIFont fontWithName:@"Palatino-Roman" size:14.0];
NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObject:font
forKey:NSFontAttributeName];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:@"strigil" attributes:attrsDictionary];
Обновление: я попытался использовать метод addAttribute:
в своем собственном приложении, но, похоже, он не работал на iOS 6 Simulator:
NSLog(@"%@", textView.attributedText);
В журнале, как представляется, отображаются правильно добавленные атрибуты, но представление на симуляторе iOS не отображается с атрибутами.
Ответ 2
Я нашел ваш вопрос, потому что я также сражался с NSAttributedString.
Для меня методы beginEditing
и endEditing
сделали трюк, как указано в Изменение атрибутивной строки.
Кроме того, lineSpacing устанавливается с помощью setLineSpacing
в пунктеStyle.
Таким образом, вы можете попробовать изменить код:
NSString *string = @" Hello \n world";
attrString = [[NSMutableAttributedString alloc] initWithString:string];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
[paragraphStyle setLineSpacing:20] // Or whatever (positive) value you like...
[attrSting beginEditing];
[attrString addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:20] range:NSMakeRange(0, string.length)];
[attrString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, string.length)];
[attrString endEditing];
mainTextView.attributedText = attrString;
Не тестировал этот точный код, хотя, кстати, но мой выглядит почти так же.
EDIT:
Между тем, я протестировал его, и, исправьте меня, если я ошибаюсь, вызовы - beginEditing
и - endEditing
кажутся весьма важными.
Ответ 3
В iOS 6 произошла ошибка, вызывающая игнорирование высоты строки при установке шрифта. См. Ответ на Пространство строк NSParagraphStyle игнорируется и более длинный анализ ошибок в Радар: UITextView игнорирует минимальную/максимальную линию Высота в атрибутной строке.
Ответ 4
//For proper line spacing
NSString *text1 = @"Hello";
NSString *text2 = @"\nWorld";
UIFont *text1Font = [UIFont fontWithName:@"HelveticaNeue-Medium" size:10];
NSMutableAttributedString *attributedString1 =
[[NSMutableAttributedString alloc] initWithString:text1 attributes:@{ NSFontAttributeName : text1Font }];
NSMutableParagraphStyle *paragraphStyle1 = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle1 setAlignment:NSTextAlignmentCenter];
[paragraphStyle1 setLineSpacing:4];
[attributedString1 addAttribute:NSParagraphStyleAttributeName value:paragraphStyle1 range:NSMakeRange(0, [attributedString1 length])];
UIFont *text2Font = [UIFont fontWithName:@"HelveticaNeue-Medium" size:16];
NSMutableAttributedString *attributedString2 =
[[NSMutableAttributedString alloc] initWithString:text2 attributes:@{NSFontAttributeName : text2Font }];
NSMutableParagraphStyle *paragraphStyle2 = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle2 setLineSpacing:4];
[paragraphStyle2 setAlignment:NSTextAlignmentCenter];
[attributedString2 addAttribute:NSParagraphStyleAttributeName value:paragraphStyle2 range:NSMakeRange(0, [attributedString2 length])];
[attributedString1 appendAttributedString:attributedString2];