Подтвердить что ты не робот

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

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

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

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

Но вся строка выравнивается влево.

4b9b3361

Ответ 1

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

Однако в iOS 7 я заметил TabStops для 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];
}

Этот код отобразит следующее:

enter image description here

Ответ 2

Основываясь на ответе @Verglas...

То, как вы обычно делаете что-то подобное в HTML, - это плавать. Что-то вроде этого::

<div><p style='float: left;'>Left</p><p style='float: right;'>Right</p><div style='clear: both;'></div></div>

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

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

NSData* d = [html dataUsingEncoding: NSUTF8StringEncoding];

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

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

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

html = @"<table style='width:100%'><tr><td>Left</td><td style='text-align:right;'>Right</td></tr></table>";

Любопытно, что это работает по назначению. Что еще более любопытно, какие атрибуты он генерирует:

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    \"<NSTextTableBlock: 0x8d9c920>\"\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    \"<NSTextTableBlock: 0x8da1550>\"\n), Lists (null), BaseWritingDirection 0, HyphenationFactor 0, TighteningFactor 0, HeaderLevel 0";
}

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

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