2013-05-24 14 views
11

Czy można dodać wyrównania w lewo i w prawo do różnych części ciągu?NSMutableAttributedString dodaj różne linie trasowania

Próbowałem dodać atrybut wyrównania do prawej strony:

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

Ale cały ciąg jest wyrównany do lewej.

Odpowiedz

36

To, co robisz w swoim kodzie, to ustawienie stylu akapitu (tekst z \ n na \ n) i nie można mieć wielu dopasowań tekstu w tym samym akapicie. Miałem ten sam problem i skończyło się na używaniu wielu UILabeli w iOS 6 :-(

Jednak w iOS 7 zauważyłem TabStops dla ParagraphStyle, co faktycznie umożliwia, ale uważam, że dokumentacja jest dość nieadekwatna. Uruchomienie go do pracy Możesz ustawić wyrównany do prawej strony TapStop, który powoduje, że tekst jest renderowany po lewej stronie określonego miejsca (aż do wypełnienia tego miejsca). Aby mój prosty przykład zadziałał, musiałem dodać najmniej jeden atrybut oprócz jednego akapitu - to mogła być tylko jasne UIColor na tle chociaż :-)

Poniżej znajduje się prosty przykład drawRect w 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]; 
} 

Ten kod będzie świadczyć następujące:

enter image description here

+0

Fajna i bardzo pomocna! – zetachang

+2

Jestem zdezorientowany, dlaczego, jeśli usunę wszystkie atrybuty oprócz NSParagraphStyleAttributeName, łamie to formatowanie. Czy to błąd, czy coś nie rozumiem? – TomSwift

+0

Tak, brzmi jak błąd dla mnie. Natknąłem się na to podczas: http: // stackoverflow.com/questions/24434552/nstextalignmentcenter-and-nstextalignmentright-are-the-wrong-way-round-in-nstext – jowie

6

Opierając się na @ odpowiedź Verglas za ...

tak, jakbyście zwykle coś jak to zrobić w HTML jest poprzez pływające. Something like this::

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

Byłoby wspaniale, gdyby można przekształcić to w NSAttributedString i to działa:

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]; 

Niestety, to nie działa.

Na drugiej próbie, możemy spróbować użyć tabeli HTML:

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

Co ciekawe, to działa zgodnie z przeznaczeniem. Co jeszcze bardziej ciekawe są atrybuty to generuje:

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"; 
} 

Przewiń w prawo i zauważyć odniesienia do NSTextTableBlock. NSTextTable nie jest publicznym interfejsem API na iOS, ale NSAttributedString initWithData: options: documentAttributes: error: użył go do wygenerowania naszego przypisanego ciągu znaków z HTML. Jest to bolesne, ponieważ oznacza, że ​​nie możemy skonstruować NSAttributedString ręcznie (musimy wygenerować go z HTML za pomocą tego API).

Budowanie przypisanych ciągów znaków z HTML jest powolne iw znacznym stopniu nieudokumentowane. Unikam go, kiedy tylko mogę.

Powiązane problemy