iphone / ipad: Wie genau wird NSAttributedString verwendet?


102

Ja, viele Leute sagen über Rich Text auf dem iPhone / iPad und viele wissen davon NSAttributedString.

Aber wie benutzt man das NSAttributedString? Ich habe lange gesucht, keine Auszüge dafür.

Ich weiß, wie man ein einrichtet. NSAttributedStringWas soll ich dann tun, um einen Text auf iPhone / iPad mit Rich Text anzuzeigen?

Die offiziellen Dokumente sagen, dass es verwendet werden sollte CoreText.Framework, was bedeutet das?

Gibt es einen einfachen Weg wie diesen?

NSAttributedString *str;
.....
UILabel *label;
label.attributedString = str;

Die obige Antwort ist jedoch richtig. Codieren Sie so und stellen Sie sicher, dass Sie das CoreText-Framework zu Ihren verknüpften Frameworks hinzufügen.
mxcl

Danke, ich habe Wes
Jack

Three20 sieht aus wie eine ziemlich beeindruckende Bibliothek: github.com/facebook/three20
David H

87
Three20 ist Mist.
Bandejapaisa

4
Das ist nervig, aber ich denke nicht, dass das das Schlimmste ist. In den letzten 6 Monaten habe ich ein Projekt gepflegt, das Three20 verwendet ... einige der Dinge, die sie mit dem Gedächtnis machen, verblüffen mich. Der Code ist sehr zerbrechlich, da er den Speicher nicht orthodox behandelt. Es ist weitaus besser, das zu tun, was sie selbst bieten. Es ist unwahrscheinlich, dass Sie alles brauchen, was sie bieten. Mach es selbst ... du wirst mehr lernen, es macht mehr Spaß, du wirst es wahrscheinlich besser machen!
Bandejapaisa

Antworten:


79

Sie sollten sich das OHAttributedLabel von AliSoftware ansehen . Es ist eine Unterklasse von UILabel, die einen NSAttributedString zeichnet und außerdem praktische Methoden zum Festlegen der Attribute eines NSAttributedString aus UIKit-Klassen bietet.

Aus dem im Repo bereitgestellten Muster:

#import "NSAttributedString+Attributes.h"
#import "OHAttributedLabel.h"

/**(1)** Build the NSAttributedString *******/
NSMutableAttributedString* attrStr = [NSMutableAttributedString attributedStringWithString:@"Hello World!"];
// for those calls we don't specify a range so it affects the whole string
[attrStr setFont:[UIFont systemFontOfSize:12]];
[attrStr setTextColor:[UIColor grayColor]];
// now we only change the color of "Hello"
[attrStr setTextColor:[UIColor redColor] range:NSMakeRange(0,5)];


/**(2)** Affect the NSAttributedString to the OHAttributedLabel *******/
myAttributedLabel.attributedText = attrStr;
// Use the "Justified" alignment
myAttributedLabel.textAlignment = UITextAlignmentJustify;
// "Hello World!" will be displayed in the label, justified, "Hello" in red and " World!" in gray.

Hinweis: In iOS 6+ können Sie zugewiesene Zeichenfolgen mit der Attribut attributeText von UILabel rendern.


Es gibt kein UIAttributedLabel. Ich denke, was Sie meinen, ist OHAttributedLabel.
Erik B

5
Es wurde im November 2010 in einem Commit in OHAttributedLabel umbenannt . Ich habe meine Antwort aktualisiert.
Wes

1
Danke Wes! Sie und Olivier Halligon, die den Code geschrieben haben! Danke dir!
DenNukem

1
Danke @Wes für die Erwähnung meiner Klasse und danke @DenNukem für die Credits ... Ich wusste nicht, dass es so berühmt ist;) Wie auch immer, ich habe seit dem ursprünglichen Beitrag viele Updates und Korrekturen an dieser Klasse vorgenommen, also nicht ' Vergessen Sie nicht, das Github-Repo zu ziehen!
AliSoftware

Ich erhalte eine Fehlermeldung in jeder einzelnen Zeile Ihres Codes. Laut der Dokumentation, die nicht von den von Ihnen bereitgestellten Methoden in der tatsächlichen Klasse vorhanden ist, bin ich verwirrt: developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
aryaxt

155

Ab iOS 6.0 können Sie dies folgendermaßen tun:

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"Hello. That is a test attributed string."];
[str addAttribute:NSBackgroundColorAttributeName value:[UIColor yellowColor] range:NSMakeRange(3,5)];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(10,7)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:20.0] range:NSMakeRange(20, 10)];
label.attributedText = str;

60
Die erste Regel des iOS-Entwicklungsprogramms besteht darin, nicht über das iOS-Entwicklungsprogramm zu sprechen.
Jeremy Moyers

5
Die zweite Regel des iOS-Entwicklungsprogramms ist ... siehe die erste Regel.
Futureelite7

32
Zu behaupten, dass jemand gegen die NDA verstoßen hat, bedeutet zu bestätigen, dass das präsentierte Material tatsächlich in iOS6 vorliegt und daher selbst eine Verletzung der NDA darstellt. Sie sollten so etwas wie "Es ist nicht möglich, Kommentare zu den Inhalten der [kommenden Version] abzugeben, ohne die NDA zu brechen".
Hatfinch

Auch wenn Sie feststellen, dass Sie viele zugeschriebene Zeichenfolgen schreiben, lesen Sie diesen Beitrag / diese Kategorie. Erleichtert die Erstellung etwas. raizlabs.com/dev/2014/03/nsattributedstring-creation-helpers
Alex Rouse

15

Sie sollten TTTAttributedLabel versuchen . Es ist ein Drop-In-Ersatz für UILabel, der mit NSAttributedString zusammenarbeitet und für UITableViewCells leistungsfähig genug ist.


Diese Klasse befindet sich in der unten genannten Three20-Bibliothek.
David H

10
Nein, dies ist nicht von drei20 (beachten Sie die 3 Ts)
vikingosegundo

6

Gibt es irgendwelche einfachen Möglichkeiten wie

NSAttributedString * str;

UILabel * label;

label.attributedString = str;

Fast. Verwenden Sie einfach einen CATextLayer. Es hat eine stringEigenschaft, die Sie auf einen NSAttributedString festlegen können.

BEARBEITEN (November 2012): Natürlich hat sich dies in iOS 6 geändert. In iOS 6 können Sie genau das tun, was das OP verlangt - eine zugewiesene Zeichenfolge direkt einem Label zuweisen attributedText.


1
Könnten Sie genauer sein, z. B. eine Beispielverwendung angeben?
William Niu

1
Ja, es heißt mein Buch, Programmieren von iOS 5. Hier ist das Codebeispiel aus dem Buch: github.com/mattneub/Programming-iOS-Book-Examples/blob/master/…
matt

6

Antwort für die UILabel-zugeordnete Textausrichtung unter iOS 6: Verwenden Sie NSMutableAttributedString und fügen Sie dem Attribut NSMutableParagraphStyle hinzu. Etwas wie das:

NSString *str = @"Hello World!";
NSRange strRange = NSMakeRange(0, str.length);
NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:str];

NSMutableParagraphStyle *paragrahStyle = [[NSMutableParagraphStyle alloc] init];
[paragrahStyle setAlignment:NSTextAlignmentCenter];
[attributedStr addAttribute:NSParagraphStyleAttributeName value:paragrahStyle range:strRange];

myUILabel.attributedText = attributedStr;

6

Ich dachte, es wäre nützlich, ein Beispiel für das Parsen einer (vereinfachten) HTML-Zeichenfolge zu geben, um einen NSAttributedString zu erstellen.

Es ist nicht vollständig - es behandelt zunächst nur <b> - und <i> -Tags und kümmert sich nicht um die Fehlerbehandlung - aber es ist hoffentlich auch ein nützliches Beispiel für den Einstieg in NSXMLParserDelegate ...


@interface ExampleHTMLStringToAttributedString : NSObject<NSXMLParserDelegate>

+(NSAttributedString*) getAttributedStringForHTMLText:(NSString*)htmlText WithFontSize:(CGFloat)fontSize;

@end

@interface ExampleHTMLStringToAttributedString()
@property NSString *mpString;
@property NSMutableAttributedString *mpAttributedString;

@property CGFloat mfFontSize;
@property NSMutableString *appendThisString;
@property BOOL mbIsBold;
@property BOOL mbIsItalic;
@end

@implementation ExampleHTMLStringToAttributedString
@synthesize mpString;
@synthesize mfFontSize;
@synthesize mpAttributedString;
@synthesize appendThisString;
@synthesize mbIsBold;
@synthesize mbIsItalic;

+(NSAttributedString*) getAttributedStringForHTMLText:(NSString*)htmlText WithFontSize:(CGFloat)fontSize {

    ExampleHTMLStringToAttributedString *me = [[ExampleHTMLStringToAttributedString alloc] initWithString:htmlText];
    return [me getAttributedStringWithFontSize:fontSize];
}

- (id)initWithString:(NSString*)inString {
    self = [super init];
    if (self) {
        if ([inString hasPrefix:@""]) {
          mpString = inString;
        } else {
            mpString = [NSString stringWithFormat:@"%@", inString];
        }
        mpAttributedString = [NSMutableAttributedString new];
    }
    return self;
}

-(NSAttributedString*) getAttributedStringWithFontSize:(CGFloat)fontSize {

    mfFontSize = fontSize;

    // Parse the XML
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:[mpString dataUsingEncoding:NSUTF8StringEncoding]];
    parser.delegate = self;
    if (![parser parse]) {
        return nil;
    }

    return mpAttributedString;
}

-(void) appendTheAccumulatedText {
    UIFont *theFont = nil;

    if (mbIsBold && mbIsItalic) {
        // http://stackoverflow.com/questions/1384181/italic-bold-and-underlined-font-on-iphone
        theFont = [UIFont fontWithName:@"Helvetica-BoldOblique" size:mfFontSize];
    } else if (mbIsBold) {
       theFont = [UIFont boldSystemFontOfSize:mfFontSize];
    } else if (mbIsItalic) {
        theFont = [UIFont italicSystemFontOfSize:mfFontSize];
    } else {
        theFont = [UIFont systemFontOfSize:mfFontSize];
    }

    NSAttributedString *appendThisAttributedString =
    [[NSAttributedString alloc]
     initWithString:appendThisString
     attributes:@{NSFontAttributeName : theFont}];

    [mpAttributedString appendAttributedString:appendThisAttributedString];

    [appendThisString setString:@""];
}

#pragma NSXMLParserDelegate delegate

-(void)parserDidStartDocument:(NSXMLParser *)parser{
    appendThisString = [NSMutableString new];
    mbIsBold = NO;
    mbIsItalic = NO;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    if ([elementName isEqualToString:@"body"]){
    } else if ([elementName isEqualToString:@"i"]) {
      [self appendTheAccumulatedText];
        mbIsItalic = YES;
    } else if ([elementName isEqualToString:@"b"]) {
      [self appendTheAccumulatedText];
        mbIsBold = YES;
    }
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if ([elementName isEqualToString:@"body"]){
      [self appendTheAccumulatedText];
    } else if ([elementName isEqualToString:@"i"]) {
      [self appendTheAccumulatedText];
      mbIsItalic = NO;
    } else if ([elementName isEqualToString:@"b"]) {
        [self appendTheAccumulatedText];
        mbIsBold = NO;
    }
}

-(void)parserDidEndDocument:(NSXMLParser *)parser{
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    [appendThisString appendString:string];
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
}

@end


Gehen Sie zur Verwendung folgendermaßen vor:


  self.myTextView.attributedText = [ExampleHTMLStringToAttributedString getAttributedStringForHTMLText:@"this is <b>bold</b> text" WithFontSize:self.myTextView.pointSize];


5

Ab iOS 6.0 können Sie dies folgendermaßen tun: einen weiteren Beispielcode.

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"This is my test code to test this label style is working or not on the text to show other user"];

[str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,31)];
[str addAttribute:NSBackgroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(61,10)];

[str addAttribute:NSFontAttributeName value: [UIFont fontWithName:@"Helvetica-Bold" size:13.0] range:NSMakeRange(32, 28)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Helvetica-Bold" size:13.0] range:NSMakeRange(65, 20)];

_textLabel.attributedText = str;

2

Für Swift verwenden Sie dies,

Es wird Titl- Texte fett machen,

var title = NSMutableAttributedString(string: "Title Text")

    title.addAttributes([NSFontAttributeName: UIFont(name: "AvenirNext-Bold", size: iCurrentFontSize)!], range: NSMakeRange(0, 4))

    label.attributedText = title

2

Ich weiß, dass es ein bisschen spät ist, aber es wird für andere nützlich sein,

NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc] initWithString:@"string" attributes:@{NSForegroundColorAttributeName:[UIColor blackColor]}];

[self.label setAttributedText:newString];

Fügen Sie das gewünschte Attribut zum Wörterbuch hinzu und übergeben Sie es als Attributparameter

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.