स्विफ्ट में NSMutableAttributedString का उपयोग करके विशिष्ट टेक्स्ट का रंग बदलना


100

मेरे पास जो समस्या है, वह यह है कि मैं एक टेक्स्ट दृश्य में कुछ पाठ के टेक्स्टकोलर को बदलने में सक्षम होना चाहता हूं। मैं एक संक्षिप्त स्ट्रिंग का उपयोग कर रहा हूं, और बस वह स्ट्रिंग चाहता हूं जिसे मैं टेक्स्ट व्यू के पाठ में जोड़ रहा हूं। ऐसा प्रतीत होता है कि मैं जो उपयोग करना चाहता हूं NSMutableAttributedString, वह है , लेकिन मुझे स्विफ्ट में इसका उपयोग करने का कोई संसाधन नहीं मिल रहा है। मेरे पास अब तक ऐसा कुछ है:

let string = "A \(stringOne) with \(stringTwo)"
var attributedString = NSMutableAttributedString(string: string)
textView.attributedText = attributedString

यहाँ से मुझे पता है कि मुझे उन शब्दों की श्रेणी को खोजने की आवश्यकता है जिनके लिए उनके टेक्स्टकोलर को बदलने की आवश्यकता है और फिर उन्हें जिम्मेदार स्ट्रिंग में जोड़ें। मुझे यह जानने की आवश्यकता है कि एट्रिब्यूटेड स्ट्रिंग से सही तारों को कैसे खोजना है, और फिर उनके टेक्स्टकोलर को बदल दें।

चूंकि मेरे पास बहुत कम रेटिंग है, इसलिए मैं अपने प्रश्न का उत्तर नहीं दे सकता, लेकिन यहाँ उत्तर मुझे मिला है

मुझे कुछ कोड का अनुवाद करने से अनुवाद करके अपना जवाब मिला

NSAttributedString में सबस्ट्रिंग की विशेषताओं को बदलें

यहाँ स्विफ्ट में कार्यान्वयन का उदाहरण दिया गया है:

let string = "A \(stringOne) and \(stringTwo)"
var attributedString = NSMutableAttributedString(string:string)

let stringOneRegex = NSRegularExpression(pattern: nameString, options: nil, error: nil)
let stringOneMatches = stringOneRegex.matchesInString(longString, options: nil, range: NSMakeRange(0, attributedString.length))
for stringOneMatch in stringOneMatches {
    let wordRange = stringOneMatch.rangeAtIndex(0)
    attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.nameColor(), range: wordRange)
}

textView.attributedText = attributedString

चूँकि मैं कई स्ट्रिंग्स के टेक्स्ट कॉलर को बदलना चाहता हूं, इसलिए मैं इसे संभालने के लिए एक हेल्पर फंक्शन करूँगा, लेकिन यह टेक्स्ट कॉलर को बदलने के लिए काम करता है।


क्या आप जानते हैं कि इसे ऑब्जेक्टिव-सी में कैसे करना है? क्या आपने स्विफ्ट में उसी कोड को फिर से लिखने का प्रयास किया है?
आरोन ब्रेजर

यहाँ एक बहुत अच्छा जवाब है: stackoverflow.com/a/37992022/426571
el_quick

जवाबों:


110

मैं देखता हूं कि आपने प्रश्न का उत्तर कुछ हद तक दिया है, लेकिन शीर्षक प्रश्न का उत्तर देने के लिए रेगेक्स का उपयोग किए बिना थोड़ा और संक्षिप्त तरीका प्रदान करना है:

पाठ की लंबाई के रंग को बदलने के लिए आपको स्ट्रिंग में रंगीन वर्णों के आरंभ और अंत सूचकांक को जानना होगा।

var main_string = "Hello World"
var string_to_color = "World"

var range = (main_string as NSString).rangeOfString(string_to_color)

फिर आप NSForegroundColorAttributeName के साथ एट्रिब्यूट किए गए स्ट्रिंग और 'एड एट्रीब्यूट' का उपयोग करते हैं:

var attributedString = NSMutableAttributedString(string:main_string)
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor() , range: range)

आगे की मानक विशेषताओं की एक सूची जो आप सेट कर सकते हैं, Apple के प्रलेखन में पाई जा सकती है


20
NSColor केवल OSX है - IOS के लिए UIColor का उपयोग करें
स्टीव ओ'कॉनर

1
क्या होगा अगर मेरे पास var main_string = "हैलो वर्ल्ड हैलो वर्ल्ड हैलो वर्ल्ड" है और मुझे पूरे स्ट्रिंग में "वर्ल्ड" पर रंग लगाने की आवश्यकता है?
msmq

main_string, string_to_colorऔर rangeकभी उत्परिवर्तित नहीं थे। उन्हें letनिरंतर बदलने पर विचार करें ?
Cesare

अच्छा समाधान है। आपने मेरा दिन बचाया है।
सागर चौहान

106

स्विफ्ट 5

let main_string = "Hello World"
let string_to_color = "World"

let range = (main_string as NSString).range(of: string_to_color)

let attribute = NSMutableAttributedString.init(string: main_string)
attribute.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red , range: range)


txtfield1 = UITextField.init(frame:CGRect(x:10 , y:20 ,width:100 , height:100))
txtfield1.attributedText = attribute

स्विफ्ट 4.2

 let txtfield1 :UITextField!

    let main_string = "Hello World"
    let string_to_color = "World"

    let range = (main_string as NSString).range(of: string_to_color)

    let attribute = NSMutableAttributedString.init(string: main_string)
    attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red , range: range)


    txtfield1 = UITextField.init(frame:CGRect(x:10 , y:20 ,width:100 , height:100))
    txtfield1.attributedText = attribute

क्या होगा अगर स्ट्रिंग बड़ा है, और कई डुप्लिकेट (समान) शब्द हैं। रेंज (का ...) काम करेगा?
हातिम

44

स्विफ्ट 2.1 अपडेट:

 let text = "We tried to make this app as most intuitive as possible for you. If you have any questions don't hesitate to ask us. For a detailed manual just click here."
 let linkTextWithColor = "click here"

 let range = (text as NSString).rangeOfString(linkTextWithColor)

 let attributedString = NSMutableAttributedString(string:text)
 attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor() , range: range)

 self.helpText.attributedText = attributedString

self.helpTextएक UILabelआउटलेट है।


1
ओह क्रिस, यू मेरे हीरो हैं। मैं इस कोड कोड को लंबे समय से खोज रहा हूं।
पैन मुल्विकी

@ कचर। मैं nassutableattributed स्ट्रिंग को टेक्स्टव्यू में बदलना चाहता हूं, क्या यह संभव है
उमा माधवी

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

आपके सहयोग के लिए धन्यवाद!
ssowri1

18

स्विफ्ट ४.२ और स्विफ्ट ५ स्ट्रिंग के कलर्स पार्ट्स।

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

एक्सटेंशन के लिए नई फ़ाइल जोड़ें, फ़ाइल -> नया -> पूर्व के लिए नाम के साथ स्विफ्ट फ़ाइल। "NSAttributedString + TextColouring" और कोड जोड़ें

import UIKit

extension String {
    func attributedStringWithColor(_ strings: [String], color: UIColor, characterSpacing: UInt? = nil) -> NSAttributedString {
        let attributedString = NSMutableAttributedString(string: self)
        for string in strings {
            let range = (self as NSString).range(of: string)
            attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range)
        }

        guard let characterSpacing = characterSpacing else {return attributedString}

        attributedString.addAttribute(NSAttributedString.Key.kern, value: characterSpacing, range: NSRange(location: 0, length: attributedString.length))

        return attributedString
    }
}

अब आप विश्व स्तर पर अपने इच्छित किसी भी दृष्टिकोण पर उपयोग कर सकते हैं:

let attributedWithTextColor: NSAttributedString = "Doc, welcome back :)".attributedStringWithColor(["Doc", "back"], color: UIColor.black)

myLabel.attributedText = attributedWithTextColor

स्विफ्ट 4 के साथ टेक्स्ट कलरिंग का उपयोग करने का उदाहरण


11

जवाब पहले से ही पिछले पोस्टों में दिया गया है लेकिन मेरे पास ऐसा करने का एक अलग तरीका है

स्विफ्ट 3x:

var myMutableString = NSMutableAttributedString()

myMutableString = NSMutableAttributedString(string: "Your full label textString")

myMutableString.setAttributes([NSFontAttributeName : UIFont(name: "HelveticaNeue-Light", size: CGFloat(17.0))!
        , NSForegroundColorAttributeName : UIColor(red: 232 / 255.0, green: 117 / 255.0, blue: 40 / 255.0, alpha: 1.0)], range: NSRange(location:12,length:8)) // What ever range you want to give

yourLabel.attributedText = myMutableString

आशा है कि यह किसी को भी मदद करता है!


@UmaMadhavi आपकी आवश्यकता क्या है?
अनुराग शर्मा

मैं टेक्स्टव्यू में फ़ॉन्ट आकार और फ़ॉन्ट रंग बदलना चाहता हूं। मैं इसे nsmutableattributedstring में प्राप्त कर रहा हूं।
उमा माधवी

इस बाहर की जाँच @UmaMadhavi link1 और link2 । यह मददगार हो सकता है!
अनुराग शर्मा

यदि फ़ॉन्ट उपलब्ध नहीं है तो क्रैश।
सेफफैस्टप्रेसिव

10

क्रिस का जवाब मेरे लिए एक बड़ी मदद थी, इसलिए मैंने उनके दृष्टिकोण का इस्तेमाल किया और एक फंक में बदल गया जिसका मैं पुन: उपयोग कर सकता हूं। आइए मैं बाकी स्ट्रिंग को एक और रंग देते हुए एक रंग को एक विकल्प के रूप में निर्दिष्ट करता हूं।

static func createAttributedString(fullString: String, fullStringColor: UIColor, subString: String, subStringColor: UIColor) -> NSMutableAttributedString
{
    let range = (fullString as NSString).rangeOfString(subString)
    let attributedString = NSMutableAttributedString(string:fullString)
    attributedString.addAttribute(NSForegroundColorAttributeName, value: fullStringColor, range: NSRange(location: 0, length: fullString.characters.count))
    attributedString.addAttribute(NSForegroundColorAttributeName, value: subStringColor, range: range)
    return attributedString
}

6

स्विफ्ट 4.1

NSAttributedStringKey.foregroundColor

उदाहरण के लिए यदि आप NavBar में फ़ॉन्ट बदलना चाहते हैं:

self.navigationController?.navigationBar.titleTextAttributes = [ NSAttributedStringKey.font: UIFont.systemFont(ofSize: 22), NSAttributedStringKey.foregroundColor: UIColor.white]

6

आप इस एक्सटेंशन का उपयोग कर सकते हैं, मैं इसका परीक्षण करता हूं

तेजी से 4.2

import Foundation
import UIKit

extension NSMutableAttributedString {

    convenience init (fullString: String, fullStringColor: UIColor, subString: String, subStringColor: UIColor) {
           let rangeOfSubString = (fullString as NSString).range(of: subString)
           let rangeOfFullString = NSRange(location: 0, length: fullString.count)//fullString.range(of: fullString)
           let attributedString = NSMutableAttributedString(string:fullString)
           attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: fullStringColor, range: rangeOfFullString)
           attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: subStringColor, range: rangeOfSubString)

           self.init(attributedString: attributedString)
   }

}

4

स्विफ्ट 2.2

var myMutableString = NSMutableAttributedString()

myMutableString = NSMutableAttributedString(string: "1234567890", attributes: [NSFontAttributeName:UIFont(name: kDefaultFontName, size: 14.0)!])

myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor(red: 0.0/255.0, green: 125.0/255.0, blue: 179.0/255.0, alpha: 1.0), range: NSRange(location:0,length:5))

self.lblPhone.attributedText = myMutableString

ऐसा करने पर मुझे एक त्रुटि मिलती है। मुझे लगता है कि आप इसके बिना चाहते हैं .CGColor
ब्योर्न रोश

@SarabjitSingh। यह कैसे संभव है पाठ के लिए
उमा माधवी

@UmaMadhavi ... आपको बस self.textView.attributedText = myMutableString जोड़ना होगा ..... यह काम करेगा ...
सरबजीत सिंह

4

अलग-अलग शैली जैसे कि रंग, फ़ॉन्ट आदि के साथ लेबल करने का सबसे आसान तरीका गुण का उपयोग निरीक्षक में "गुण" है। बस पाठ का हिस्सा चुनें और इसे बदल दें जैसे आप चाहते हैं

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


1
यह मानकर कि आप प्रोग्राम को क्रमिक रूप से नहीं बदल रहे हैं
एलेजांद्रो कम्पा

4

इससे पहले कि मैं एक स्ट्रिंग विस्तार बनाया जवाब के आधार पर

extension String {

func highlightWordsIn(highlightedWords: String, attributes: [[NSAttributedStringKey: Any]]) -> NSMutableAttributedString {
     let range = (self as NSString).range(of: highlightedWords)
     let result = NSMutableAttributedString(string: self)

     for attribute in attributes {
         result.addAttributes(attribute, range: range)
     }

     return result
    }
}

आप विधि के लिए पाठ के लिए विशेषताएँ पास कर सकते हैं

इस तरह बुलाओ

  let attributes = [[NSAttributedStringKey.foregroundColor:UIColor.red], [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 17)]]
  myLabel.attributedText = "This is a text".highlightWordsIn(highlightedWords: "is a text", attributes: attributes)

4

स्विफ्ट 4.1

मैं इस स्विफ्ट 3 से बदल गया हूं

let str = "Welcome "
let welcomeAttribute = [ NSForegroundColorAttributeName: UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)

और यह स्विफ्ट 4.0 में है

let str = "Welcome "
let welcomeAttribute = [ NSAttributedStringKey.foregroundColor: UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)

करने के लिए स्विफ्ट 4.1

let str = "Welcome "
let welcomeAttribute = [ NSAttributedStringKey(rawValue: NSForegroundColorAttributeName): UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)

ठीक काम करता है


यह पूरी स्ट्रिंग बदल रहा है? यह मेरे लिए सबसे अधिक पठनीय है, लेकिन क्या ओपी द्वारा पूछे गए स्ट्रिंग के भीतर केवल विशिष्ट शब्दों को बदलने का एक तरीका है।
मूंदड़ा

3

तेजी से 4.2

    let textString = "Hello world"
    let range = (textString as NSString).range(of: "world")
    let attributedString = NSMutableAttributedString(string: textString)

    attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: range)
    self.textUIlable.attributedText = attributedString

2

हर कोई जो " पाठ में कई शब्दों के लिए विशिष्ट रंग लागू करना " की तलाश में है , हम इसे NSRegularExpression का उपयोग करके कर सकते हैं

 func highlight(matchingText: String, in text: String) {
    let attributedString  = NSMutableAttributedString(string: text)
    if let regularExpression = try? NSRegularExpression(pattern: "\(matchingText)", options: .caseInsensitive) {
        let matchedResults = regularExpression.matches(in: text, options: [], range: NSRange(location: 0, length: attributedString.length))
        for matched in matchedResults {
             attributedString.addAttributes([NSAttributedStringKey.backgroundColor : UIColor.yellow], range: matched.range)

        }
        yourLabel.attributedText = attributedString
    }
}

संदर्भ लिंक: https://gist.github.com/aquajach/4d9398b95a748fd37e88


क्या MacOS कोको ऐप में अपने कोड का उपयोग करना संभव है? मैंने अपने कोको प्रोजेक्ट में इसका उपयोग करने की कोशिश की, लेकिन कोको NSTextView में कोई .attributedText नहीं है।
CaOs433

2

यह आपके लिए काम कर सकता है

let main_string = " User not found,Want to review ? Click here"
    let string_to_color = "Click here"

    let range = (main_string as NSString).range(of: string_to_color)

    let attribute = NSMutableAttributedString.init(string: main_string)
    attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.blue , range: range)

    lblClickHere.attributedText = attribute

1
हालांकि यह कोड स्निपेट समाधान हो सकता है, स्पष्टीकरण सहित वास्तव में आपके पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
एचएमडी

2

इस सरल फ़ंक्शन के साथ आप टेक्स्ट को असाइन कर सकते हैं और चुने हुए शब्द को हाइलाइट कर सकते हैं।

आप UITextView को UILabel आदि में भी बदल सकते हैं ।

func highlightBoldWordAtLabel(textViewTotransform: UITextView, completeText: String, wordToBold: String){
    textViewToTransform.text = completeText
    let range = (completeText as NSString).range(of: wordToBold)
    let attribute = NSMutableAttributedString.init(string: completeText)

    attribute.addAttribute(NSAttributedString.Key.font, value: UIFont.boldSystemFont(ofSize: 16), range: range)
    attribute.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.black , range: range)
    textViewToTransform.attributedText = attribute
}

1

फ़ॉन्ट रंग का रंग बदलने के लिए, पहले सादा के बजाय नीचे की छवि में पसंद किए गए को चुनें

फिर आपको जिम्मेदार क्षेत्र में पाठ का चयन करने की आवश्यकता है और फिर संरेखण के दाईं ओर रंग बटन का चयन करें। इससे रंग बदल जाएगा।


1

आप इस विधि का उपयोग कर सकते हैं। मैंने विश्व स्तर पर पहुँच के लिए अपनी सामान्य उपयोगिता वर्ग में इस पद्धति को लागू किया।

func attributedString(with highlightString: String, normalString: String, highlightColor: UIColor) -> NSMutableAttributedString {
    let attributes = [NSAttributedString.Key.foregroundColor: highlightColor]
    let attributedString = NSMutableAttributedString(string: highlightString, attributes: attributes)
    attributedString.append(NSAttributedString(string: normalString))
    return attributedString
}

0

यदि आप Swift 3x और UITextView का उपयोग कर रहे हैं, तो शायद NSForegroundColorAttributeName काम नहीं करेगा (यह मेरे लिए काम नहीं करता था, चाहे जो भी मैंने कोशिश की हो)।

इसलिए, कुछ खुदाई के बाद मुझे एक समाधान मिला।

//Get the textView somehow
let textView = UITextView()
//Set the attributed string with links to it
textView.attributedString = attributedString
//Set the tint color. It will apply to the link only
textView.tintColor = UIColor.red

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


0

आपको टेक्स्टव्यू मापदंडों को बदलने की आवश्यकता है, न कि जिम्मेदार स्ट्रिंग के मापदंडों को

textView.linkTextAttributes = [
        NSAttributedString.Key.foregroundColor: UIColor.red,
        NSAttributedString.Key.underlineColor: UIColor.red,
        NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue
    ]


0
extension String{
// to make text field mandatory * looks
mutating func markAsMandatoryField()-> NSAttributedString{

    let main_string = self
    let string_to_color = "*"
    let range = (main_string as NSString).range(of: string_to_color)
    print("The rang = \(range)")
    let attribute = NSMutableAttributedString.init(string: main_string)
    attribute.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.rgbColor(red: 255.0, green: 0.0, blue: 23.0) , range: range)
     return attribute
}

}

EmailLbl.attributedText = EmailLbl.text! .markAsMandatoryField () का उपयोग करें


0

आप साधारण एक्सटेंशन के रूप में उपयोग कर सकते हैं

extension String{

func attributedString(subStr: String) -> NSMutableAttributedString{
    let range = (self as NSString).range(of: subStr)
    let attributedString = NSMutableAttributedString(string:self)
    attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red , range: range)
    
    return attributedString
  }
}

myLable.attributedText = fullStr.attributedString(subStr: strToChange)

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