2013-05-24 4 views
11

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

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

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

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

ответ

36

Что вы делаете в своем коде, это установить стиль абзаца (текст от \ 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

+0

Прохладный и очень полезный! – zetachang

+2

Я смущен, почему, если я удалю все атрибуты помимо NSParagraphStyleAttributeName, это приведет к разрыву форматирования. Это ошибка или я что-то не понимаю? – TomSwift

+0

Да, звучит как ошибка для меня. Я столкнулся с этим, выполняя это: http: // stackoverflow.com/questions/24434552/nstextalignmentcenter-and-nstextalignmentright-are-the-wrong-way-round-in-nstext – jowie

6

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

так, как вы обычно делаете что-то подобное в HTML осуществляется с помощью плавающей. Something like this::

<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 является медленным и в значительной степени недокументированным. Я избегаю этого, когда могу.