NSMutableAttributedString добавить различные выравнивания

Можно ли добавить левое и правое выравнивание к различным частям строки?

Я попытался добавить атрибут выравнивания в правой части:

    NSMutableParagraphStyle *paragrahStyle = [[NSMutableParagraphStyle alloc] init];
    [paragrahStyle setAlignment:NSTextAlignmentRight];
    [mutableAttributedString addAttribute:NSParagraphStyleAttributeName value:paragrahStyle range:rangeOfDate];

Но вся строка выровнена по левому краю.

Ответы на вопрос(2)

Решение Вопроса

Что вы делаете в своем коде, так это устанавливаете стиль абзаца (текст от до), и невозможно иметь несколько выравниваний текста в одном абзаце. У меня была та же проблема, и в итоге я использовал несколько UILabels в iOS 6 :-(

Однако в iOS 7 я заметил TabStops for ParagraphStyle. Это на самом деле делает это возможным, но я нахожу документацию совершенно неадекватной. Однако я закончил тем, что заставил это работать. Вы можете установить выравнивание по правому краю TapStop, в результате чего ваш текст будет отображаться слева от указанной остановки (до тех пор, пока это пространство не будет заполнено). Для того, чтобы мой простой пример работал, мне нужно было добавить хотя бы еще один атрибут, кроме первого, - хотя это мог бы быть просто UIColor для фона :-)

Ниже приведен простой пример drawRect в UIView:

- (void)drawRect:(CGRect)rect
{
    NSString *str = @"to the left\tto the right\nleft again\tright again";
    NSMutableAttributedString *att = [[NSMutableAttributedString alloc] initWithString:str];

    NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
    paragraph.maximumLineHeight = 12.0f;
    paragraph.alignment = NSTextAlignmentLeft;

    NSTextTab *t = [[NSTextTab alloc] initWithTextAlignment:NSTextAlignmentRight location:rect.size.width options:nil];
    paragraph.tabStops = @[t];

    [att addAttribute:NSBackgroundColorAttributeName value:[UIColor magentaColor] range:NSMakeRange(0, @"to the left".length)];
    [att addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Trebuchet-BoldItalic" size:12.0] range:NSMakeRange(12, 5)];
    [att addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(str.length - 4, 2)];
    [att addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, str.length)];

    [att drawInRect:rect];
}

Этот код будет отображать следующее:

 zetachang03 окт. 2013 г., 15:24
Круто и очень полезно!
 David H13 февр. 2016 г., 23:27
iOS9, смог просто добавить один атрибут - но в NSTextTab, если я попытался установитьoption (которая работала нормально с правыми упорами), это создало проблему, поэтому я оставил ее пустой. Большое спасибо за это!
 jayjunck23 февр. 2015 г., 23:50
Я вижу, что у UILabel есть свойствоattributedText», что может правильно отобразить приписанную строку.
 jayjunck12 сент. 2016 г., 18:57
Вы должны указать, что текст после остановки выравнивается по правому краю. Это выравнивание устанавливается равным ширине вмещающего представления, в результате чего право текста совпадает с правом представления. Имеет смысл?
 Sam B12 сент. 2016 г., 14:48
Что такое rect.size.width? Что делать, если я неЯ не хочу этим пользоваться. Что я должен положить в месте: ??
 jowie06 авг. 2014 г., 16:48
Да, звучит как ошибка для меня. Я сталкивался с этим, делая это:stackoverflow.com/questions/24434552/...
 vahotm19 февр. 2015 г., 13:20
Почему вы рисуете приписанную строку в drawRect? Что, если я просто хочу установить его на свой лейбл?
 TomSwift19 нояб. 2013 г., 19:03
Я смущен, почему, если я удаляю все атрибуты, кроме NSParagraphStyleAttributeName, это нарушает форматирование. Это ошибка или я что-то недопонимаю?

Опираясь на @Verglas 'с ответом ...

Как тыЯ обычно делаю что-то подобное в HTML через плавающий.Что-то вроде этого::

<p style="float: left;">Left</p><p style="float: right;">Right</p>

Было бы здорово, если бы вы могли преобразовать это в NSAttributedString и заставить его работать:

NSString* html = @"<p style="float: left;">Left</p><p style="float: right;">Right</p>";

NSData* d = [html dataUsingEncoding: NSUTF8StringEncoding];

NSAttributedString* as = [[NSMutableAttributedString alloc] initWithData: d
                                               options: @{
                                                          NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                                          NSCharacterEncodingDocumentAttribute : @(NSUTF8StringEncoding)
                                                          }
                                    documentAttributes: nil
                                                 error: nil];

К сожалению, это не работает.

Для второй попытки мы можем попробовать использовать таблицу HTML:

html = @"LeftRight";

Любопытно, что это работает как задумано. Какие'Еще более любопытны атрибуты, которые он генерирует:

2014-08-27 14:27:31.443 testParagraphStyles[2095:60b] range: {0, 5} attributes: {
     NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n    \"\"\n), Lists (null), BaseWritingDirection 0, HyphenationFactor 0, TighteningFactor 0, HeaderLevel 0";

2014-08-27 14:27:31.444 testParagraphStyles[2095:60b] range: {5, 6} attributes: {
    NSParagraphStyle = "Alignment 2, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n    \"\"\n), Lists (null), BaseWritingDirection 0, HyphenationFactor 0, TighteningFactor 0, HeaderLevel 0";
}

Прокрутите вправо и обратите внимание на ссылку на NSTextTableBlock. NSTextTable isn 't открытый API на iOS, но NSAttributedString initWithData: options: documentAttributes: error: использовал его для генерации нашей атрибутивной строки из HTML Это больно, потому что это означает, что мы можемt создать NSAttributedString вручную (мы должны сгенерировать его из HTML, используя этот API).

Построение атрибутивных строк из HTML происходит медленно и в основном не документировано. Я избегаю этого всякий раз, когда могу.

Ваш ответ на вопрос