iphone / ipad: NSAttributedString का उपयोग कैसे करें?


102

हां, बहुत से लोग iPhone / iPad में रिच टेक्स्ट के बारे में कह रहे हैं और बहुत से लोग जानते हैं NSAttributedString

लेकिन उपयोग कैसे करें NSAttributedString? मैंने बहुत समय तक खोज की, इसके लिए कोई निष्कर्ष नहीं निकाला।

मुझे पता है कि मुझे कैसे सेट करना है NSAttributedString, तो मुझे रिच टेक्स्ट के साथ iPhone / iPad पर टेक्स्ट प्रदर्शित करने के लिए क्या करना चाहिए?

आधिकारिक डॉक्स का कहना CoreText.Frameworkहै कि इसका उपयोग किया जाना चाहिए , इसका क्या मतलब है?

क्या इसका कोई सरल तरीका है?

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

उपरोक्त उत्तर हालांकि सही है। उस तरह का कोड और सुनिश्चित करें कि आप अपने लिंक किए गए चौखटे में CoreText ढांचे को जोड़ दें।
mxcl 12

धन्यवाद, मैंने
जैक

एक सुंदर प्रभावशाली पुस्तकालय की तरह तीन ooks: github.com/facebook/three20
डेविड एच।

87
तीन20 बकवास है।
बंदगीजैसा

4
यह गुस्सा है, लेकिन मुझे नहीं लगता कि यह बदतर बात है। पिछले 6 महीनों से, मैं एक ऐसी परियोजना बना रहा हूं जिसमें थ्री 20 का उपयोग किया गया है ... कुछ चीजें जो वे स्मृति के साथ करते हैं वे मुझे चकरा देते हैं। कोड वास्तव में नाजुक है क्योंकि यह रूढ़िवादी तरीके से स्मृति को संभालता नहीं है। यह बेहतर है कि वे अपने आप को प्रदान करें। यह संभावना नहीं है कि आप वे सब कुछ प्रदान करने जा रहे हैं जो वे प्रदान करते हैं। इसे स्वयं करें ... आप अधिक सीखेंगे, यह अधिक मजेदार है, आप शायद इसे बेहतर करेंगे!
बैंडेज़पाइस

जवाबों:


79

आपको AliSoftware की OHAttributedLabel पर एक नज़र डालनी चाहिए । यह यूआईबेल का एक उपवर्ग है जो एक NSAttributedString ड्रॉ करता है और UIKit वर्गों से NSAttributedString की विशेषताओं को सेट करने के लिए सुविधा विधियाँ भी प्रदान करता है।

रेपो में दिए गए नमूने से:

#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.

नोट: iOS 6+ में आप UILabel की एट्रिब्यूटेड टेक्स्ट संपत्ति का उपयोग करके स्ट्रिंग्स को रेंडर कर सकते हैं।


UIAttributedLabel जैसी कोई चीज नहीं है। मुझे लगता है कि आप जिसका जिक्र कर रहे हैं, वह OHAttributedLabel है।
एरिक बी

5
नवंबर 2010 में एक नाम में OHAttributedLabel का नाम बदल दिया गया । मैंने अपना उत्तर अपडेट कर दिया है।
वेस

1
थैंक यू वेस! आप और ओलिवियर हॉलिगॉन जिन्होंने कोड लिखा था! धन्यवाद!
१N

1
मेरी कक्षा का उल्लेख करने के लिए धन्यवाद @, और क्रेडिट के लिए @DenNukem धन्यवाद ... मुझे नहीं पता था कि यह इतना प्रसिद्ध था;) वैसे भी, मैंने मूल पोस्ट के बाद से इस वर्ग पर बहुत सारे अपडेट और सुधार किए थे, इसलिए डॉन ' टी github रेपो खींचने के लिए भूल जाओ!
अलीसंफर

मुझे आपके कोड की हर एक लाइन पर एक त्रुटि मिलती है। आपके द्वारा प्रदान किए गए तरीकों के गैर-दस्तावेज के अनुसार वास्तविक कक्षा में मौजूद है, मैं भ्रमित हूं: developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
aryaxt

155

IOS 6.0 से शुरू करके आप इसे इस तरह कर सकते हैं:

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
IOS देव कार्यक्रम का पहला नियम iOS देव कार्यक्रम के बारे में बात करना नहीं है।
जेरेमी मोयर्स

5
आईओएस देव कार्यक्रम का दूसरा नियम है ... पहला नियम देखें।
Futureelite7

32
यह बताने के लिए कि किसी ने एनडीए का उल्लंघन किया है, यह पुष्टि करना है कि प्रस्तुत सामग्री वास्तव में आईओएस 6 में है, और इसलिए वह स्वयं एनडीए का उल्लंघन है। आपको "एनडीए को तोड़ने के बिना [आगामी संस्करण] में क्या टिप्पणी करना संभव नहीं है" जैसा कुछ लिखना चाहिए।
हेटफिंच

इसके अलावा, यदि आप खुद को बहुत सारे जिम्मेदार स्ट्रिंग्स लिखते हुए पाते हैं, तो इस पोस्ट / श्रेणी को देखें। बनाना थोड़ा आसान है। raizlabs.com/dev/2014/03/nsattributedstring-creation-helpers
Alex Rouse

15

आपको TTTAttributedLabel आज़माना चाहिए । यह UILabel के लिए एक ड्रॉप-इन प्रतिस्थापन है जो NSAttributedString के साथ काम करता है और UITableViewCells के लिए पर्याप्त प्रदर्शन करता है।


यह कक्षा नीचे वर्णित तीन20 पुस्तकालय में पाई जाती है।
डेविड एच।

10
नहीं, यह तीन20 से नहीं है (3 Ts पर ध्यान दें)
vikingosegundo

6

क्या कोई सरल तरीके हैं

NSAttributedString * str;

यूलाबेल * लेबल;

label.attributedString = str;

लगभग। बस एक CATextLayer का उपयोग करें। यह एक stringसंपत्ति है कि आप एक NSAttributedString करने के लिए सेट कर सकते हैं।

EDIT (नवंबर, 2012): बेशक यह सब iOS 6 में बदल गया है। iOS 6 में, आप ठीक वही कर सकते हैं जो ओपी ने पूछा था - एक लेबल के लिए सीधे एक जिम्मेदार स्ट्रिंग असाइन करें attributedText


1
क्या आप अधिक विशिष्ट हो सकते हैं, उदाहरण के लिए उदाहरण प्रदान करें?
विलियम निउ

1
हां, इसे मेरी पुस्तक कहा जाता है, प्रोग्रामिंग आईओएस 5. यहाँ पुस्तक से कोड उदाहरण है: github.com/mattneub/Programming-iOS-Book-Examples/blob/master/…
मैट

6

IOS 6 में यूआईबेल के लिए उत्तर पाठ संरेखण जिम्मेदार है: NSMutableAttributedString का उपयोग करें और विशेषता में NSMutableParagraphStyle जोड़ें। कुछ इस तरह:

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

मुझे लगा कि NSAttributedString बनाने के लिए एक (सरलीकृत) HTML स्ट्रिंग को पार्स करने का एक उदाहरण देना उपयोगी होगा।

यह पूर्ण नहीं है - यह केवल शुरुआत के लिए <b> और <i> टैग को संभालता है, और किसी भी त्रुटि से निपटने में परेशान नहीं करता है - लेकिन उम्मीद है कि 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


उपयोग करने के लिए, ऐसा कुछ करें:


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


5

IOS 6.0 से शुरू करके आप इसे इस तरह कर सकते हैं: एक और नमूना कोड।

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

के लिए स्विफ्ट इस का उपयोग,

यह टटल ग्रंथों को बोल्ड करेगा,

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

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

    label.attributedText = title

2

मुझे पता है कि यह थोड़ा देर से है, लेकिन यह अन्य के लिए उपयोगी होगा,

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

[self.label setAttributedText:newString];

शब्दकोश में वांछित विशेषता जोड़ें और इसे एक विशेषता पैरामीटर के रूप में पास करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.