2013-05-24 3 views
11

Ist es möglich, linken und rechten Ausrichtungen zu verschiedenen Teilen der Zeichenfolge hinzuzufügen?NSMutableAttributedString verschiedene Ausrichtungen hinzufügen

Ich versuchte Ausrichtung Attribut auf den rechten Teil hinzuzufügen:

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

Aber die ganze Zeichenfolge nach links ausgerichtet.

Antwort

36

In Ihrem Code können Sie den Absatzstil (den Text von \ n bis \ n) festlegen und es ist nicht möglich, mehrere Textausrichtungen im selben Absatz zu verwenden. Ich hatte das selbe Problem und habe am Ende mehrere UILabels in iOS 6 benutzt :-(

Allerdings habe ich in iOS 7 TabStops für ParagraphStyle bemerkt. Das macht es eigentlich möglich, aber ich finde die Dokumentation ziemlich unzureichend. Ich habe aber beendet Sie können einen rechts ausgerichteten TapStop einstellen, der bewirkt, dass Ihr Text links vom angegebenen Stop gerendert wird (bis dieser Platz gefüllt ist.) Um mein einfaches Beispiel zu erhalten, musste ich hinzufügen mindestens ein weiteres Attribut neben dem Absatz ein - es :-)

Hier finden sie ein einfaches Beispiel für drawRect in einem UIView obwohl nur eine klare UIColor für den Hintergrund gewesen sein könnte:

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

Dieser Code wird machen Sie folgendes:

enter image description here

+0

Cool und wirklich hilfreich! – zetachang

+2

Ich bin verwirrt, warum, wenn ich alle Attribute neben NSParagraphStyleAttributeName entfernen, dass es die Formatierung bricht. Ist das ein Fehler oder missverstehe ich etwas? – TomSwift

+0

Ja, klingt wie ein Fehler für mich. Ich bin dabei gestolpert: http: // stackoverflow.com/questions/24434552/nstextalignmentcenter-und-nstextalignmentright-sind-die-falsche-weg-round-in-nstext – jowie

6

Aufbauend auf @ Verglas Antwort ...

Die Art und Weise Sie in der Regel etwas tun würde, wie dies in HTML ist über schwimmen. Something like this::

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

Es wäre toll, wenn Sie diese in eine NSAttributedString verwandeln könnte und haben es:

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

Leider funktioniert es nicht.

Für einen zweiten Versuch, können wir versuchen, eine HTML-Tabelle:

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

Merkwürdiger, das funktioniert wie vorgesehen. Was ist noch neugieriger sind die Attribute, es erzeugt:

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

Blättern Sie nach rechts und beachten Sie den Hinweis auf NSTextTableBlock. NSTextTable ist keine öffentliche API unter iOS, sondern NSAttributedString initWithData: options: documentAttributes: error: verwendet, um unsere attributierte Zeichenfolge aus HTML zu generieren. Dies ist sehr schmerzhaft, da es bedeutet, dass wir einen NSAtributedString nicht manuell erstellen können (wir müssen ihn für HTML mithilfe dieser API generieren).

Der Aufbau attributierter Strings aus HTML ist langsam und weitgehend undokumentiert. Ich vermeide es, wann immer ich kann.

Verwandte Themen