आप NSAttributedString का उपयोग कैसे करते हैं?


308

एक NSStringया एक से अधिक रंग NSMutableStringsसंभव नहीं हैं। इसलिए मैंने इसके बारे में थोड़ा सुना है NSAttributedStringजो iPad SDK 3.2 (या 3.2 के आसपास) के साथ पेश किया गया था और iPhone पर iPhone SDK 4.0 बीटा के रूप में उपलब्ध है ।

मैं एक स्ट्रिंग रखना चाहूंगा जिसमें तीन रंग हों।

मैं 3 अलग-अलग एनएसएसट्रेस का उपयोग नहीं करता, इसका कारण यह है कि तीन NSAttributedStringसबस्ट्रिंग्स में से प्रत्येक की लंबाई अक्सर बदलती रहती है और इसलिए मैं 3 अलग-अलग NSStringऑब्जेक्ट्स को री-पोज़िशन करने के लिए किसी भी गणना का उपयोग नहीं करना पसंद करूंगा ।

यदि यह संभव है NSAttributedStringकि मैं निम्नलिखित कैसे बनाऊं - (यदि NSAttributed string के साथ संभव नहीं है तो आप इसे कैसे करेंगे):

वैकल्पिक शब्द

संपादित करें: याद रखें, @"first", @"second"और @"third"किसी भी समय अन्य तार से बदल दिया जाएगा। इसलिए हार्डकॉस्ट NSRange मूल्यों का उपयोग करने से काम नहीं चलेगा।



NSAttributeString के लिए स्विफ्ट कोड: stackoverflow.com/questions/27728466/…
किरीट मोदी

जवाबों:


479

जब जिम्मेदार तारों का निर्माण होता है, तो मैं केवल चीजों को साफ रखने के लिए, म्यूटेबल उपवर्ग का उपयोग करना पसंद करता हूं।

कहा जा रहा है, यहाँ बताया गया है कि आप किस तरह से एक त्रि-रंग का जिम्मेदार स्ट्रिंग बनाते हैं:

NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:@"firstsecondthird"];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];

एक ब्राउज़र में टाइप किया गया। चेतावनी देने वाला

जाहिर है आप इस तरह की सीमाओं में हार्ड-कोड के लिए नहीं जा रहे हैं। शायद इसके बजाय आप कुछ ऐसा कर सकते हैं:

NSDictionary * wordToColorMapping = ....;  //an NSDictionary of NSString => UIColor pairs
NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:@""];
for (NSString * word in wordToColorMapping) {
  UIColor * color = [wordToColorMapping objectForKey:word];
  NSDictionary * attributes = [NSDictionary dictionaryWithObject:color forKey:NSForegroundColorAttributeName];
  NSAttributedString * subString = [[NSAttributedString alloc] initWithString:word attributes:attributes];
  [string appendAttributedString:subString];
  [subString release];
}

//display string

4
क्या आप कृपया मुझे बता सकते हैं कि लेबल के लिए स्ट्रिंग को कैसे असाइन किया जाए?
पूजा एम। बोहरा ने

5
@SyedFarazHaiderZaidi UIKit में ऐसा कुछ भी नहीं बनाया गया है जो स्वीकार करता हो NSAttributedString। हालाँकि, ओपन सोर्स चीजें हैं, जैसे कि OHAttributedLabel
डेव डोंगलोंग

4
यदि आप iOS पर CoreText.framework का उपयोग कर रहे हैं, तो आप शायद kCTForegroundColorAttributeNameइसके बजाय निरंतर चाहते हैं NSForegroundColorAttributeName
फिल केल्विन

32
IOS6 में, जिसे अभी जारी किया गया था (इसलिए मैं NDA के बिना बात कर सकता हूं), आप myLabel.attributedText = आरोपित स्ट्रींग जैसी चीजें कर सकते हैं; यह भयावह समय के बारे में है ... मैं वर्षों से इस सुविधा का इंतजार कर रहा था।
केविन हॉफमैन

5
चेतावनी: शब्दकोश कुंजियाँ अनियंत्रित हैं। ऊपर दिए गए कोड का उपयोग न करें, आप अपने तार प्रदर्शित होने के क्रम पर नियंत्रण ढीला कर देंगे।
मैट-लॉयड

117

इस सवाल का जवाब पहले ही दिया जा चुका है ... लेकिन मैं यह दिखाना चाहता था कि छाया को कैसे जोड़ा जाए और साथ ही NSAttributedString के साथ फ़ॉन्ट को बदल दिया जाए, ताकि जब लोग इस विषय की खोज करें तो उन्हें ढूंढते रहना न पड़े।

#define FONT_SIZE 20
#define FONT_HELVETICA @"Helvetica-Light"
#define BLACK_SHADOW [UIColor colorWithRed:40.0f/255.0f green:40.0f/255.0f blue:40.0f/255.0f alpha:0.4f]

NSString*myNSString = @"This is my string.\nIt goes to a second line.";                

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
               paragraphStyle.alignment = NSTextAlignmentCenter;
             paragraphStyle.lineSpacing = FONT_SIZE/2;
                     UIFont * labelFont = [UIFont fontWithName:FONT_HELVETICA size:FONT_SIZE];
                   UIColor * labelColor = [UIColor colorWithWhite:1 alpha:1];
                       NSShadow *shadow = [[NSShadow alloc] init];
                 [shadow setShadowColor : BLACK_SHADOW];
                [shadow setShadowOffset : CGSizeMake (1.0, 1.0)];
            [shadow setShadowBlurRadius : 1];

NSAttributedString *labelText = [[NSAttributedString alloc] initWithString : myNSString
                      attributes : @{
   NSParagraphStyleAttributeName : paragraphStyle,
             NSKernAttributeName : @2.0,
             NSFontAttributeName : labelFont,
  NSForegroundColorAttributeName : labelColor,
           NSShadowAttributeName : shadow }];

यहाँ एक स्विफ्ट संस्करण है ...

चेतावनी! यह 4 के लिए काम करता है।

5s के लिए आपको फ्लोट के सभी मानों को डबल वैल्यू में बदलना होगा (क्योंकि कंपाइलर अभी तक सही तरीके से काम नहीं कर रहा है)

फ़ॉन्ट विकल्प के लिए स्विफ्ट एनम:

enum FontValue: Int {
    case FVBold = 1 , FVCondensedBlack, FVMedium, FVHelveticaNeue, FVLight, FVCondensedBold, FVLightItalic, FVUltraLightItalic, FVUltraLight, FVBoldItalic, FVItalic
}

एनम पहुंच के लिए स्विफ्ट सरणी (क्योंकि एनम का उपयोग नहीं कर सकते हैं '-'):

func helveticaFont (index:Int) -> (String) {
    let fontArray = [
    "HelveticaNeue-Bold",
    "HelveticaNeue-CondensedBlack",
    "HelveticaNeue-Medium",
    "HelveticaNeue",
    "HelveticaNeue-Light",
    "HelveticaNeue-CondensedBold",
    "HelveticaNeue-LightItalic",
    "HelveticaNeue-UltraLightItalic",
    "HelveticaNeue-UltraLight",
    "HelveticaNeue-BoldItalic",
    "HelveticaNeue-Italic",
    ]
    return fontArray[index]
}

स्विफ्ट जिम्मेदार पाठ फ़ंक्शन:

func myAttributedText (myString:String, mySize: Float, myFont:FontValue) -> (NSMutableAttributedString) {

    let shadow = NSShadow()
    shadow.shadowColor = UIColor.textShadowColor()
    shadow.shadowOffset = CGSizeMake (1.0, 1.0)
    shadow.shadowBlurRadius = 1

    let paragraphStyle = NSMutableParagraphStyle.alloc()
    paragraphStyle.lineHeightMultiple = 1
    paragraphStyle.lineBreakMode = NSLineBreakMode.ByWordWrapping
    paragraphStyle.alignment = NSTextAlignment.Center

    let labelFont = UIFont(name: helveticaFont(myFont.toRaw()), size: mySize)
    let labelColor = UIColor.whiteColor()

    let myAttributes :Dictionary = [NSParagraphStyleAttributeName : paragraphStyle,
                                              NSKernAttributeName : 3, // (-1,5)
                                              NSFontAttributeName : labelFont,
                                   NSForegroundColorAttributeName : labelColor,
                                            NSShadowAttributeName : shadow]

    let myAttributedString = NSMutableAttributedString (string: myString, attributes:myAttributes)

    // add new color 
    let secondColor = UIColor.blackColor()
    let stringArray = myString.componentsSeparatedByString(" ")
    let firstString: String? = stringArray.first
    let letterCount = countElements(firstString!)
    if firstString {
        myAttributedString.addAttributes([NSForegroundColorAttributeName:secondColor], range:NSMakeRange(0,letterCount))
    }

    return  myAttributedString
}

स्ट्रिंग एरे में रेंज खोजने के लिए उपयोग किया गया पहला और अंतिम एक्सटेंशन:

extension Array {
    var last: T? {
        if self.isEmpty {
            NSLog("array crash error - please fix")
            return self [0]
        } else {
            return self[self.endIndex - 1]
        }
    }
}

extension Array {
    var first: T? {
        if self.isEmpty {
            NSLog("array crash error - please fix")
            return self [0]
        } else {
            return self [0]
        }
    }
}

नए रंग:

extension UIColor {
    class func shadowColor() -> UIColor {
        return UIColor(red: 0.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: 0.3)
    }
    class func textShadowColor() -> UIColor {
        return UIColor(red: 50.0/255.0, green: 50.0/255.0, blue: 50.0/255.0, alpha: 0.5)
    }
    class func pastelBlueColor() -> UIColor {
        return UIColor(red: 176.0/255.0, green: 186.0/255.0, blue: 255.0/255.0, alpha: 1)
    }
    class func pastelYellowColor() -> UIColor {
        return UIColor(red: 255.0/255.0, green: 238.0/255.0, blue: 140.0/255.0, alpha: 1)
    }
}

मेरा मैक्रो प्रतिस्थापन:

enum MyConstants: Float {
    case CornerRadius = 5.0
}

मेरा बटन बनाने वाला w / जिम्मेदार पाठ:

func myButtonMaker (myView:UIView) -> UIButton {

    let myButton = UIButton.buttonWithType(.System) as UIButton
    myButton.backgroundColor = UIColor.pastelBlueColor()
    myButton.showsTouchWhenHighlighted = true;
    let myCGSize:CGSize = CGSizeMake(100.0, 50.0)
    let myFrame = CGRectMake(myView.frame.midX - myCGSize.height,myView.frame.midY - 2 * myCGSize.height,myCGSize.width,myCGSize.height)
    myButton.frame = myFrame
    let myTitle = myAttributedText("Button",20.0,FontValue.FVLight)
    myButton.setAttributedTitle(myTitle, forState:.Normal)

    myButton.layer.cornerRadius = myButton.bounds.size.width / MyConstants.CornerRadius.toRaw()
    myButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
    myButton.tag = 100
    myButton.bringSubviewToFront(myView)
    myButton.layerGradient()

    myView.addSubview(myButton)

    return  myButton
}

मेरा यूआईवीवाई / यूआईबेल मेकर डब्ल्यू / एट्रिब्यूटेड टेक्स्ट, शैडो और राउंड कॉर्नर:

func myLabelMaker (myView:UIView) -> UIView {

    let myFrame = CGRectMake(myView.frame.midX / 2 , myView.frame.midY / 2, myView.frame.width/2, myView.frame.height/2)
    let mylabelFrame = CGRectMake(0, 0, myView.frame.width/2, myView.frame.height/2)

    let myBaseView = UIView()
    myBaseView.frame = myFrame
    myBaseView.backgroundColor = UIColor.clearColor()

    let myLabel = UILabel()
    myLabel.backgroundColor=UIColor.pastelYellowColor()
    myLabel.frame = mylabelFrame

    myLabel.attributedText = myAttributedText("This is my String",20.0,FontValue.FVLight)
    myLabel.numberOfLines = 5
    myLabel.tag = 100
    myLabel.layer.cornerRadius = myLabel.bounds.size.width / MyConstants.CornerRadius.toRaw()
    myLabel.clipsToBounds = true
    myLabel.layerborders()

    myBaseView.addSubview(myLabel)

    myBaseView.layerShadow()
    myBaseView.layerGradient()

    myView.addSubview(myBaseView)

    return myLabel
}

सामान्य छाया जोड़ें:

func viewshadow<T where T: UIView> (shadowObject: T)
{
    let layer = shadowObject.layer
    let radius = shadowObject.frame.size.width / MyConstants.CornerRadius.toRaw();
    layer.borderColor = UIColor.whiteColor().CGColor
    layer.borderWidth = 0.8
    layer.cornerRadius = radius
    layer.shadowOpacity = 1
    layer.shadowRadius = 3
    layer.shadowOffset = CGSizeMake(2.0,2.0)
    layer.shadowColor = UIColor.shadowColor().CGColor
}

दृश्य शैली के लिए एक्सटेंशन देखें:

extension UIView {
    func layerborders() {
        let layer = self.layer
        let frame = self.frame
        let myColor = self.backgroundColor
        layer.borderColor = myColor.CGColor
        layer.borderWidth = 10.8
        layer.cornerRadius = layer.borderWidth / MyConstants.CornerRadius.toRaw()
    }

    func layerShadow() {
        let layer = self.layer
        let frame = self.frame
        layer.cornerRadius = layer.borderWidth / MyConstants.CornerRadius.toRaw()
        layer.shadowOpacity = 1
        layer.shadowRadius = 3
        layer.shadowOffset = CGSizeMake(2.0,2.0)
        layer.shadowColor = UIColor.shadowColor().CGColor
    }

    func layerGradient() {
        let layer = CAGradientLayer()
        let size = self.frame.size
        layer.frame.size = size
        layer.frame.origin = CGPointMake(0.0,0.0)
        layer.cornerRadius = layer.bounds.size.width / MyConstants.CornerRadius.toRaw();

        var color0 = CGColorCreateGenericRGB(250.0/255, 250.0/255, 250.0/255, 0.5)
        var color1 = CGColorCreateGenericRGB(200.0/255, 200.0/255, 200.0/255, 0.1)
        var color2 = CGColorCreateGenericRGB(150.0/255, 150.0/255, 150.0/255, 0.1)
        var color3 = CGColorCreateGenericRGB(100.0/255, 100.0/255, 100.0/255, 0.1)
        var color4 = CGColorCreateGenericRGB(50.0/255, 50.0/255, 50.0/255, 0.1)
        var color5 = CGColorCreateGenericRGB(0.0/255, 0.0/255, 0.0/255, 0.1)
        var color6 = CGColorCreateGenericRGB(150.0/255, 150.0/255, 150.0/255, 0.1)

        layer.colors = [color0,color1,color2,color3,color4,color5,color6]
        self.layer.insertSublayer(layer, atIndex: 2)
    }
}

वास्तविक दृश्य ने लोड कार्य किया:

func buttonPress (sender:UIButton!) {
    NSLog("%@", "ButtonPressed")
}

override func viewDidLoad() {
    super.viewDidLoad()

    let myLabel = myLabelMaker(myView)
    let myButton = myButtonMaker(myView)

    myButton.addTarget(self, action: "buttonPress:", forControlEvents:UIControlEvents.TouchUpInside)

    viewshadow(myButton)
    viewshadow(myLabel)

}

33

मुझे लगता है, यह regular expressionsविशेषताओं को लागू करने के लिए एक सीमा खोजने के लिए उपयोग करने के लिए एक बहुत ही सुविधाजनक तरीका है । मैंने इस तरह से इसे किया:

NSMutableAttributedString *goodText = [[NSMutableAttributedString alloc] initWithString:articleText];

NSRange range = [articleText rangeOfString:@"\\[.+?\\]" options:NSRegularExpressionSearch|NSCaseInsensitiveSearch];
if (range.location != NSNotFound) {
    [goodText addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Georgia" size:16] range:range];
    [goodText addAttribute:NSForegroundColorAttributeName value:[UIColor brownColor] range:range];
}

NSString *regEx = [NSString stringWithFormat:@"%@.+?\\s", [self.article.titleText substringToIndex:0]];
range = [articleText rangeOfString:regEx options:NSRegularExpressionSearch|NSCaseInsensitiveSearch];
if (range.location != NSNotFound) {
    [goodText addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Georgia-Bold" size:20] range:range];
    [goodText addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:range];
}

[self.textView setAttributedText:goodText];

मैं उपलब्ध विशेषताओं की सूची खोज रहा था और उन्हें यहाँ और किसी कक्षा संदर्भ के प्रथम पृष्ठ में नहीं मिला। इसलिए मैंने उस पर यहां जानकारी पोस्ट करने का फैसला किया।

मानक गुण

संलग्न तार पाठ के लिए निम्नलिखित मानक विशेषताओं का समर्थन करते हैं। यदि कुंजी शब्दकोश में नहीं है, तो नीचे वर्णित डिफ़ॉल्ट मानों का उपयोग करें।

NSString *NSFontAttributeName;
NSString *NSParagraphStyleAttributeName;
NSString *NSForegroundColorAttributeName;
NSString *NSUnderlineStyleAttributeName;
NSString *NSSuperscriptAttributeName;
NSString *NSBackgroundColorAttributeName;
NSString *NSAttachmentAttributeName;
NSString *NSLigatureAttributeName;
NSString *NSBaselineOffsetAttributeName;
NSString *NSKernAttributeName;
NSString *NSLinkAttributeName;
NSString *NSStrokeWidthAttributeName;
NSString *NSStrokeColorAttributeName;
NSString *NSUnderlineColorAttributeName;
NSString *NSStrikethroughStyleAttributeName;
NSString *NSStrikethroughColorAttributeName;
NSString *NSShadowAttributeName;
NSString *NSObliquenessAttributeName;
NSString *NSExpansionAttributeName;
NSString *NSCursorAttributeName;
NSString *NSToolTipAttributeName;
NSString *NSMarkedClauseSegmentAttributeName;
NSString *NSWritingDirectionAttributeName;
NSString *NSVerticalGlyphFormAttributeName;
NSString *NSTextAlternativesAttributeName;

NSAttributedString प्रोग्रामिंग गाइड

एक पूर्ण वर्ग संदर्भ यहाँ है


विशेषता कुंजियों को सूचीबद्ध करने के लिए धन्यवाद (इसलिए अन्यथा खोजना कठिन है)
अली सईद

आप स्विफ्ट में यह कैसे करेंगे?
थॉमस मार्टिनेज

25

यह समाधान किसी भी लम्बाई के लिए काम करेगा

NSString *strFirst = @"Anylengthtext";
NSString *strSecond = @"Anylengthtext";
NSString *strThird = @"Anylengthtext";

NSString *strComplete = [NSString stringWithFormat:@"%@ %@ %@",strFirst,strSecond,strThird];

NSMutableAttributedString *attributedString =[[NSMutableAttributedString alloc] initWithString:strComplete];

[attributedString addAttribute:NSForegroundColorAttributeName
              value:[UIColor redColor]
              range:[strComplete rangeOfString:strFirst]];

[attributedString addAttribute:NSForegroundColorAttributeName
              value:[UIColor yellowColor]
              range:[strComplete rangeOfString:strSecond]];

[attributedString addAttribute:NSForegroundColorAttributeName
              value:[UIColor blueColor]
              range:[strComplete rangeOfString:strThird]];


self.lblName.attributedText = attributedString;

ध्यान दें कि स्विफ्ट के लिए, आपको NSString का उपयोग करने की आवश्यकता है, क्योंकि सीमाओं के कारण, इस उत्तर को देखें: stackoverflow.com/a/27041376/1736679
Efren

15

मैंने आसानी से विशेषताएँ जोड़ने के लिए सहायक लिखा है:

- (void)addColor:(UIColor *)color substring:(NSString *)substring;
- (void)addBackgroundColor:(UIColor *)color substring:(NSString *)substring;
- (void)addUnderlineForSubstring:(NSString *)substring;
- (void)addStrikeThrough:(int)thickness substring:(NSString *)substring;
- (void)addShadowColor:(UIColor *)color width:(int)width height:(int)height radius:(int)radius substring:(NSString *)substring;
- (void)addFontWithName:(NSString *)fontName size:(int)fontSize substring:(NSString *)substring;
- (void)addAlignment:(NSTextAlignment)alignment substring:(NSString *)substring;
- (void)addColorToRussianText:(UIColor *)color;
- (void)addStrokeColor:(UIColor *)color thickness:(int)thickness substring:(NSString *)substring;
- (void)addVerticalGlyph:(BOOL)glyph substring:(NSString *)substring;

https://github.com/shmidt/MASAttributes

आप कोकोआपोड्स के माध्यम से भी स्थापित कर सकते हैं: pod 'MASAttributes', '~> 1.0.0'


11

IOS 7 के बाद से आप NSAttributedStringHTML सिंटैक्स के साथ उपयोग कर सकते हैं :

NSURL *htmlString = [[NSBundle mainBundle]  URLForResource: @"string"     withExtension:@"html"];
NSAttributedString *stringWithHTMLAttributes = [[NSAttributedString alloc] initWithFileURL:htmlString
                                                                                       options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType}
                                                                            documentAttributes:nil
                                                                                         error:nil];
textView.attributedText = stringWithHTMLAttributes;// you can use a label also

आपको प्रोजेक्ट में "string.html" फ़ाइल को जोड़ना होगा, और html की सामग्री इस तरह हो सकती है:

<html>
  <head>
    <style type="text/css">
      body {
        font-size: 15px;
        font-family: Avenir, Arial, sans-serif;
      }
      .red {
        color: red;
      }
      .green {
        color: green;
      }
      .blue {
        color: blue;
      }
    </style>
  </head>
  <body>
    <span class="red">first</span><span class="green">second</span><span class="blue">third</span>
  </body>
</html>  

अब, आप NSAttributedStringHTML फ़ाइल के बिना भी, जैसे चाहें उदाहरण के लिए उपयोग कर सकते हैं :

//At the top of your .m file
#define RED_OCCURENCE -red_occurence-
#define GREEN_OCCURENCE -green_occurence-
#define BLUE_OCCURENCE -blue_occurence-
#define HTML_TEMPLATE @"<span style=\"color:red\">-red_occurence-</span><span style=\"color:green\">-green_occurence-</span><span style=\"color:blue\">-blue_occurence-</span></body></html>"

//Where you need to use your attributed string
NSString *string = [HTML_TEMPLATE stringByReplacingOccurrencesOfString:RED_OCCURENCE withString:@"first"] ;
string = [string stringByReplacingOccurrencesOfString:GREEN_OCCURENCE   withString:@"second"];
string = [string stringByReplacingOccurrencesOfString:BLUE_OCCURENCE    withString:@"third"];

NSData* cData = [string dataUsingEncoding:NSUTF8StringEncoding];

NSAttributedString *stringWithHTMLAttributes = [[NSAttributedString alloc] initWithData:cData
                                                                                options:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType}
                                                                        documentAttributes:nil
                                                                                     error:nil];
textView.attributedText = stringWithHTMLAttributes;

स्रोत


10

मैं हमेशा एक अविश्वसनीय रूप से लंबे घुमावदार और थकाऊ प्रक्रिया के लिए जिम्मेदार तार के साथ काम करता पाया गया।

इसलिए मैंने एक मैक ऐप बनाया जो आपके लिए सभी कोड बनाता है।

https://itunes.apple.com/us/app/attributed-string-creator/id730928349?mt=12


इसके अलावा यहाँ NSAttributed string को थोड़ा आसान बनाने के लिए एक श्रेणी / ब्लॉग पोस्ट है। raizlabs.com/dev/2014/03/nsattributedstring-creation-helpers
Alex Rouse

3

जिम्मेदार स्ट्रिंग एक्सटेंशन के साथ एक आसान समाधान।

extension NSMutableAttributedString {

    // this function attaches color to string    
    func setColorForText(textToFind: String, withColor color: UIColor) {
        let range: NSRange = self.mutableString.range(of: textToFind, options: .caseInsensitive)
        self.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)
    }

}

इसे देखें और देखें (स्विफ्ट 3 और 4 में परीक्षण किया गया)

let label = UILabel()
label.frame = CGRect(x: 120, y: 100, width: 200, height: 30)
let first = "first"
let second = "second"
let third = "third"
let stringValue = "\(first)\(second)\(third)"  // or direct assign single string value like "firstsecondthird"

let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringValue)
attributedString.setColorForText(textToFind: first, withColor: UIColor.red)   // use variable for string "first"
attributedString.setColorForText(textToFind: "second", withColor: UIColor.green) // or direct string like this "second"
attributedString.setColorForText(textToFind: third, withColor: UIColor.blue)
label.font = UIFont.systemFont(ofSize: 26)
label.attributedText = attributedString
self.view.addSubview(label)

यहाँ अपेक्षित परिणाम है:

यहां छवि विवरण दर्ज करें


3

स्विफ्ट 4 में:

let string:NSMutableAttributedString = {

    let mutableString = NSMutableAttributedString(string: "firstsecondthird")

    mutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.red , range: NSRange(location: 0, length: 5))
    mutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.green , range: NSRange(location: 5, length: 6))
    mutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blue , range: NSRange(location: 11, length: 5))
    return mutableString
}()

print(string)

1
कृपया कई प्रश्नों के समान उत्तर न दें। एक अच्छा उत्तर पोस्ट करें, फिर डुप्लिकेट के रूप में अन्य प्रश्नों को बंद करने के लिए वोट / ध्वज दें। यदि प्रश्न डुप्लिकेट नहीं है, तो प्रश्न के अपने उत्तरों को दर्जी करें।
पॉल रॉब

मैं स्विफ्ट में जवाब देने की कोशिश कर रहा हूं। मैंने इसका डुप्लीकेट स्वीकार कर लिया। वोटों की उम्मीद नहीं
अंकित

क्षमा याचना। मैंने उत्तर हटा दिया है
अंकित ने

2

आप अनुवर्ती HTMLस्ट्रिंग को निम्नानुसार लोड कर सकते Swiftहैं

   var Str = NSAttributedString(
   data: htmlstring.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true),
   options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
   documentAttributes: nil,
   error: nil)

   label.attributedText = Str  

htmlफ़ाइल से लोड करने के लिए

   if let rtf = NSBundle.mainBundle().URLForResource("rtfdoc", withExtension: "rtf", subdirectory: nil, localization: nil) {

   let attributedString = NSAttributedString(fileURL: rtf, options: [NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType], documentAttributes: nil, error: nil)
        textView.attributedText = attributedString
        textView.editable = false
    }

http://sketchytech.blogspot.in/2013/11/creating-nsattributedstring-from-html.html

और अपनी आवश्यक विशेषता के अनुसार सेटअप स्ट्रिंग .... इस का पालन करें ..
http://makeapppie.com/2014/10/20/swift-swift-using-attributed-strings-in-swift/


2

मैंने एक पुस्तकालय बनाया जो इसे बहुत आसान बनाता है। ज़ेनकोपी की जाँच करें

आप स्टाइल ऑब्जेक्ट बना सकते हैं, और / या बाद में संदर्भ के लिए उन्हें कुंजी पर सेट कर सकते हैं। ऐशे ही:

ZenCopy.manager.config.setStyles {
    return [
        "token": Style(
            color: .blueColor(), // optional
            // fontName: "Helvetica", // optional
            fontSize: 14 // optional
        )
    ]
}

फिर, आप आसानी से स्ट्रिंग्स का निर्माण कर सकते हैं और उन्हें स्टाइल कर सकते हैं और उनके पास हो सकते हैं :)

label.attributedText = attributedString(
                                ["$0 ".style("token") "is dancing with ", "$1".style("token")], 
                          args: ["JP", "Brock"]
)

आप रेगेक्स खोजों के साथ चीजों को आसानी से स्टाइल भी कर सकते हैं!

let atUserRegex = "(@[A-Za-z0-9_]*)"
mutableAttributedString.regexFind(atUserRegex, addStyle: "token")

यह सभी शब्दों को 'टोकन' शैली के साथ उसके सामने '@' के साथ शैली देगा। (उदा @jpmcglone)

मुझे अभी भी इसे काम करने की आवश्यकता है w / सब कुछ NSAttributedStringकी पेशकश करनी है, लेकिन मुझे लगता है fontName, fontSizeऔर रंग इसके थोक को कवर करता है। बहुत सारे अपडेट की उम्मीद है जल्द ही :)

जरूरत पड़ने पर इसके साथ शुरुआत करने में मैं आपकी मदद कर सकता हूं। प्रतिक्रिया की तलाश में भी, इसलिए यदि यह आपके जीवन को आसान बनाता है, तो मैं कहूंगा कि मिशन पूरा हुआ।


1
- (void)changeColorWithString:(UILabel *)uilabel stringToReplace:(NSString *) stringToReplace uiColor:(UIColor *) uiColor{
    NSMutableAttributedString *text =
    [[NSMutableAttributedString alloc]
     initWithAttributedString: uilabel.attributedText];

    [text addAttribute: NSForegroundColorAttributeName value:uiColor range:[uilabel.text rangeOfString:stringToReplace]];

    [uilabel setAttributedText: text];

}

0

इस तरह की समस्याओं को हल करने के लिए मैंने स्विफ्ट में लाइब्रेरी बनाई, जिसे एवेंजिका कहा जाता है।

let str = "<r>first</r><g>second</g><b>third</b>".style(tags:
        Style("r").foregroundColor(.red),
        Style("g").foregroundColor(.green),
        Style("b").foregroundColor(.blue)).attributedString

label.attributedText = str

आप इसे यहाँ पा सकते हैं https://github.com/psharanda/Atributika


0

स्विफ्ट 4

let combination = NSMutableAttributedString()

var part1 = NSMutableAttributedString()
var part2 = NSMutableAttributedString()
var part3 = NSMutableAttributedString()

let attrRegular = [NSAttributedStringKey.font : UIFont(name: "Palatino-Roman", size: 15)]

let attrBold:Dictionary = [NSAttributedStringKey.font : UIFont(name: "Raleway-SemiBold", size: 15)]

let attrBoldWithColor: Dictionary = [NSAttributedStringKey.font : UIFont(name: "Raleway-SemiBold", size: 15),
                                 NSAttributedStringKey.foregroundColor: UIColor.red]

if let regular = attrRegular as? [NSAttributedStringKey : NSObject]{
    part1 = NSMutableAttributedString(string: "first", attributes: regular)

}
if let bold = attrRegular as? [NSAttributedStringKey : NSObject]{
    part2 = NSMutableAttributedString(string: "second", attributes: bold)
}

if let boldWithColor = attrBoldWithColor as? [NSAttributedStringKey : NSObject]{
    part3 = NSMutableAttributedString(string: "third", attributes: boldWithColor)
}

combination.append(part1)
combination.append(part2)
combination.append(part3)

विशेषताएँ सूची कृपया यहाँ देखें NSAttributedStringKey Apple डॉक्स पर


0

सुपर आसान तरीका यह करने के लिए।

let text = "This is a colorful attributed string"
let attributedText = 
NSMutableAttributedString.getAttributedString(fromString: text)
attributedText.apply(color: .red, subString: "This")
//Apply yellow color on range
attributedText.apply(color: .yellow, onRange: NSMakeRange(5, 4))

अधिक विस्तार के लिए यहां क्लिक करें; https://github.com/iOSTechHub/AttributedString

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