আইফোন / আইপ্যাড: এনএসএট্রিবিউটস্ট্রিং ঠিক কীভাবে ব্যবহার করবেন?


102

হ্যাঁ, অনেকে আইফোন / আইপ্যাডে রিচ টেক্সট সম্পর্কে বলছেন এবং অনেকেই জানেন NSAttributedString

তবে কীভাবে ব্যবহার করবেন NSAttributedString? আমি অনেক সময় অনুসন্ধান করেছি, এর জন্য কোনও এক্সট্র্যাক্ট ক্লু নেই।

আমি কীভাবে সেট আপ করতে জানি NSAttributedString, তারপরে সমৃদ্ধ পাঠ্য সহ আইফোন / আইপ্যাডে কোনও পাঠ্য প্রদর্শন করতে আমার কী করা উচিত?

অফিসিয়াল ডক্স বলছে এটি ব্যবহার করা উচিত CoreText.Framework, এর অর্থ কী?

এর মতো সহজ কোন উপায় আছে কি?

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

উপরের উত্তরটি যদিও সঠিক। এর মতো কোড করুন এবং আপনার লিঙ্কযুক্ত ফ্রেমওয়ার্কগুলিতে আপনি কোরটেক্সট ফ্রেমওয়ার্ক যুক্ত করেছেন তা নিশ্চিত করুন।
এমএক্সসিএল

ধন্যবাদ, আমি ওয়েসের সঠিক উত্তরটি রেখে দিয়েছি
জ্যাক

থ্রি -২০ দেখতে অনেকটা চিত্তাকর্ষক লাইব্রেরির মতো: github.com/facebook/three20
ডেভিড এইচ

87
থ্রি -20 হ'ল বোকা।
বান্দেজপাটাইস

4
বিরক্তিকর, তবে আমি মনে করি না যে এটি আরও খারাপ জিনিস। গত 6 মাস ধরে, আমি এমন একটি প্রকল্প বজায় রাখছি যা থ্রি 20 ব্যবহার করে ... স্মৃতিতে তারা কিছু করায় আমাকে অবাক করে। কোডটি সত্যই নাজুক কারণ এটি গোঁড়া উপায়ে মেমরি পরিচালনা করে না। তারা নিজেরাই যা সরবরাহ করে তা করা আরও অনেক ভাল। আপনার প্রদত্ত সমস্ত কিছুর দরকার পড়ার সম্ভাবনা নেই। এটি নিজে করুন ... আপনি আরও শিখবেন, আরও মজাদার, আপনি সম্ভবত এটি আরও ভাল করবেন!
বন্দেজাপাইস

উত্তর:


79

আপনার আলি সাফটওয়ারের ওএইচএটিগ্রিবিউটেড লেবেলটি একবার দেখে নেওয়া উচিত । এটি ইউআইএলবেলের একটি সাবক্লাস যা একটি এনএসএট্রিবিউটেড স্ট্রিং অঙ্কন করে এবং ইউআইকিট ক্লাস থেকে এনএসএট্রিবিউটেড স্ট্রিংয়ের বৈশিষ্ট্যগুলি নির্ধারণের জন্য সুবিধাজনক পদ্ধতিগুলি সরবরাহ করে।

রেপোতে সরবরাহিত নমুনা থেকে:

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

নোট: ইন আইওএস 6+ আপনি ব্যবহার আরোপিত স্ট্রিং রেন্ডার করতে পারে attributedText UILabel এর সম্পত্তি।


ইউআইএআইটিগ্রিবিউটেড লেবেল বলে কোনও জিনিস নেই। আমি মনে করি আপনি যা উল্লেখ করছেন তা হ'ল ওহ্যাট্রিবিউটেড লেবেল।
এরিক বি

5
২০১০ সালের নভেম্বর মাসে এটির নামকরণ করা হয় ওএইচটিগ্রিবিউটেড লেবেল । আমি আমার উত্তর আপডেট করেছি।
ওয়েস

1
ধন্যবাদ ওয়েস! আপনি এবং অলিভার হলিগন কোডটি লিখেছেন! ধন্যবাদ!
ডেনউকেম

1
ধন্যবাদ আমার ধন্যবাদ আমার ক্লাসটি উল্লেখ করার জন্য, এবং ক্রেডিটগুলির জন্য @ ডেনউকেমকে ধন্যবাদ জানাই ... এটি এত বিখ্যাত যে আমি জানতাম না;) যাইহোক, মূল পোস্টের পরে আমি এই ক্লাসে অনেকগুলি আপডেট এবং সংশোধন করেছি, তাই ডন ' গিথুব রেপো টানতে ভুলে যাবেন না!
AliSoftware

আমি আপনার কোডের প্রতিটি এক লাইনে একটি ত্রুটি পেয়েছি। প্রকৃত শ্রেণিতে আপনি যে পদ্ধতিগুলি সরবরাহ করেছেন
সেগুলির

155

আইওএস 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
আইওএস ডেভ প্রোগ্রামের প্রথম নিয়মটি আইওএস ডেভ প্রোগ্রাম সম্পর্কে কথা বলা নয়।
জেরেমি ময়য়ার্স

5
আইওএস ডেভ প্রোগ্রামের দ্বিতীয় নিয়মটি হল ... প্রথম নিয়মটি দেখুন।
ভবিষ্যতলাইট

32
কেউ এনডিএ লঙ্ঘন করেছে তা উল্লেখ করার জন্য উপস্থাপন করা উপাদানটি সত্যই আইওএস 6-এ রয়েছে এবং এটি নিজেই এনডিএর লঙ্ঘন। আপনার "এনডিএ ভঙ্গ না করে [আসন্ন সংস্করণে] কী আছে সে সম্পর্কে মন্তব্য করা সম্ভব নয়" এর মতো কিছু লেখা উচিত।
হ্যাটিফঞ্চ

এছাড়াও আপনি যদি নিজেকে অনেকগুলি বিশিষ্ট স্ট্রিং লিখতে দেখেন তবে এই পোস্ট / বিভাগটি দেখুন। সৃষ্টিটি কিছুটা সহজ করে তোলে। raizlabs.com/dev/2014/03/nsattributesstring-creation-helpers
অ্যালেক্স রাউস

15

আপনার টিটিটিএটিগ্রিবিউটেড লেবেল চেষ্টা করা উচিত । এটি ইউআইএলবেলের জন্য একটি ড্রপ-ইন প্রতিস্থাপন যা এনএসএট্রিবিউটেড স্ট্রিংয়ের সাথে কাজ করে এবং ইউআইটিএবলভিউকেলসের জন্য যথেষ্ট পারফরম্যান্ট।


এই শ্রেণিটি নীচে উল্লিখিত থ্রি -20 লাইব্রেরিতে পাওয়া যায়।
ডেভিড এইচ

10
না, এটি তিন20 থেকে নেই (3 টি নোটটি নোট করুন)
ভাইকিংগুন্ডো

6

এর মতো কোনও সহজ উপায় আছে কি?

এনএসএট্রিবিউটেড স্ট্রিং * আরআর;

ইউআইএলবেল * লেবেল;

লেবেল.অ্যাট্রিবিউটেড স্ট্রিং = str;

প্রায়। কেবল একটি ক্যাটেক্সটায়ার ব্যবহার করুন। এটির একটি stringসম্পত্তি রয়েছে যা আপনি একটি এনএসএট্রিবিউটেড স্ট্রিংয়ে সেট করতে পারেন।

সম্পাদনা (নভেম্বর, ২০১২): অবশ্যই আইওএস in-এ এই সমস্ত কিছু পরিবর্তিত হয়েছে আইওএস In-এ, আপনি ওপি যা চেয়েছিলেন ঠিক তেমন করতে পারেন - সরাসরি কোনও লেবেলে একটি বিশিষ্ট স্ট্রিং বরাদ্দ করুন attributedText


1
আপনি আরও নির্দিষ্ট করতে পারেন, উদাহরণস্বরূপ একটি ব্যবহারের সরবরাহ?
উইলিয়াম নিু

1
হ্যাঁ, এটিকে আমার বই, প্রোগ্রামিং আইওএস 5 বলা হয়। এখানে বইয়ের কোড উদাহরণ রয়েছে: github.com/mattneub/Programming-iOS- বুক- উদাহরণসমূহ
ম্যাট

6

আইওএস 6-এ ইউআইএলবেল বিশিষ্ট পাঠ্য প্রান্তিককরণের জন্য উত্তর: এনএসমুটেবলঅ্যাট্রিবিউটেড স্ট্রিং ব্যবহার করুন এবং এনএসএমউটেবলপরাগ্রাফটি স্টাইলটিকে বৈশিষ্ট্যে যুক্ত করুন। এটার মতো কিছু:

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

আমি ভেবেছিলাম একটি এনএসএট্রিবিউটেড স্ট্রিং তৈরি করতে একটি (সরলীকৃত) এইচটিএমএল স্ট্রিংকে পার্স করার একটি উদাহরণ দেওয়া কার্যকর হবে।

এটি সম্পূর্ণ নয় - এটি কেবল <b> এবং <i> ট্যাগগুলি শুরু করে, এবং কোনও ত্রুটি পরিচালনার জন্য বিরক্ত করে না - তবে আশা করি এনএসএক্সএমএলপিপারসারডেলিগেট দিয়ে কীভাবে শুরু করবেন তার একটি কার্যকর উদাহরণ ...


@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

আইওএস 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];

অভিধানে কাঙ্ক্ষিত বৈশিষ্ট্য যুক্ত করুন এবং এটিকে অ্যাট্রিবিউট প্যারামিটার হিসাবে পাস করুন pass

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.