मैं स्विफ्ट का उपयोग करके एक जिम्मेदार स्ट्रिंग कैसे बना सकता हूं?


316

मैं एक साधारण कॉफी कैलकुलेटर बनाने की कोशिश कर रहा हूं। मुझे कॉफी की मात्रा को ग्राम में प्रदर्शित करने की आवश्यकता है। ग्राम के लिए "g" प्रतीक को मेरे UILabel से संलग्न करने की आवश्यकता है जिसका उपयोग मैं राशि प्रदर्शित करने के लिए कर रहा हूं। यूआईबेल में संख्याएं उपयोगकर्ता इनपुट के साथ गतिशील रूप से ठीक-ठीक बदल रही हैं, लेकिन मुझे स्ट्रिंग के अंत में एक कम मामले "जी" को जोड़ने की आवश्यकता है जो अद्यतन संख्याओं से अलग स्वरूपित है। "जी" को संख्याओं के साथ संलग्न करने की आवश्यकता है ताकि संख्या आकार और स्थिति में परिवर्तन हो, संख्याओं के साथ "जी" "चलता" है। मुझे यकीन है कि यह समस्या हल हो गई है इससे पहले कि सही दिशा में एक लिंक मददगार होगा क्योंकि मैंने अपने छोटे दिल को बाहर निकाल दिया है।

मैंने एक जिम्मेदार स्ट्रिंग के लिए प्रलेखन के माध्यम से खोज की है और मैंने ऐप स्टोर से एक "एट्रीब्यूटेड स्ट्रिंग क्रिएटर" को भी डाउनहोल्ड कर दिया है, लेकिन परिणामी कोड ऑब्जेक्टिव-सी में है और मैं स्विफ्ट का उपयोग कर रहा हूं। इस भाषा को सीखने वाले अन्य डेवलपर्स के लिए क्या भयानक होगा, और शायद ही उपयोगी होगा, स्विफ्ट में एक जिम्मेदार स्ट्रिंग का उपयोग करके कस्टम विशेषताओं के साथ कस्टम फ़ॉन्ट बनाने का एक स्पष्ट उदाहरण है। इसके लिए दस्तावेज़ीकरण बहुत ही भ्रामक है क्योंकि ऐसा करने का कोई बहुत स्पष्ट रास्ता नहीं है। मेरी योजना जिम्मेदार स्ट्रिंग बनाने और इसे मेरे कॉफीआम स्ट्रिंग के अंत में जोड़ने की है।

var coffeeAmount: String = calculatedCoffee + attributedText

जहाँ कैलकुफ़्टी एक इंट को स्ट्रिंग में परिवर्तित किया जाता है और "एट्रिब्यूटेड टेक्स्ट" लोवरकेस "जी" है जिसे कस्टमाइज्ड फॉन्ट के साथ बनाया जा रहा है। शायद मैं इसके बारे में गलत तरीके से जा रहा हूं। किसी भी मदद की सराहना की है!

जवाबों:


969

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

यह उत्तर स्विफ्ट 4.2 के लिए अद्यतन किया गया है।

त्वरित संदर्भ

एक जिम्मेदार स्ट्रिंग बनाने और स्थापित करने का सामान्य रूप इस तरह है। आप नीचे अन्य सामान्य विकल्प पा सकते हैं।

// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute) 

// set attributed text on a UILabel
myLabel.attributedText = myAttrString

लिखावट का रंग

let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]

पीछे का रंग

let myAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]

फ़ॉन्ट

let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]

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

let myAttribute = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue ]

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

let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray

let myAttribute = [ NSAttributedString.Key.shadow: myShadow ]

इस पोस्ट के बाकी उन लोगों के लिए और अधिक विवरण देता है जो रुचि रखते हैं।


गुण

स्ट्रिंग विशेषताएँ केवल एक शब्दकोष हैं [NSAttributedString.Key: Any], जहां NSAttributedString.Keyविशेषता का प्रमुख नाम है और Anyकुछ प्रकार का मूल्य है। मान एक फ़ॉन्ट, एक रंग, एक पूर्णांक, या कुछ और हो सकता है। स्विफ्ट में कई मानक विशेषताएँ हैं जो पहले से ही पूर्वनिर्धारित हैं। उदाहरण के लिए:

  • मुख्य नाम:, NSAttributedString.Key.fontमूल्य: एUIFont
  • मुख्य नाम:, NSAttributedString.Key.foregroundColorमूल्य: एUIColor
  • मुख्य नाम:, NSAttributedString.Key.linkमान: a NSURLयाNSString

कई अन्य हैं। अधिक के लिए इस लिंक को देखें । आप अपनी स्वयं की कस्टम विशेषताएँ भी बना सकते हैं जैसे:

  • मुख्य नाम:, NSAttributedString.Key.myNameमान: कुछ प्रकार।
    यदि आप एक एक्सटेंशन बनाते हैं :

    extension NSAttributedString.Key {
        static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
    }
    

स्विफ्ट में विशेषताएँ बनाना

आप किसी अन्य शब्दकोश को घोषित करने की तरह ही विशेषताओं की घोषणा कर सकते हैं।

// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]

// multiple attributes declared at once
let multipleAttributes: [NSAttributedString.Key : Any] = [
    NSAttributedString.Key.foregroundColor: UIColor.green,
    NSAttributedString.Key.backgroundColor: UIColor.yellow,
    NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]

// custom attribute
let customAttribute = [ NSAttributedString.Key.myName: "Some value" ]

ध्यान दें rawValueकि अंडरलाइन शैली मूल्य के लिए आवश्यक था।

क्योंकि विशेषताएँ सिर्फ डिक्शनरी हैं, आप उन्हें एक खाली शब्दकोश बनाकर और फिर उसमें कुंजी-मूल्य जोड़े जोड़कर भी बना सकते हैं। यदि मान में कई प्रकार होंगे, तो आपको Anyप्रकार के रूप में उपयोग करना होगा । यहाँ multipleAttributesऊपर से उदाहरण दिया गया है, इस तरह से बनाया गया है:

var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue

स्ट्रगल किया

अब जब आप विशेषताओं को समझते हैं, तो आप जिम्मेदार स्ट्रिंग्स बना सकते हैं।

प्रारंभ

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

// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")

// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])

// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)

यदि आपको बाद में विशेषताओं या स्ट्रिंग सामग्री को बदलने की आवश्यकता होगी, तो आपको उपयोग करना चाहिए NSMutableAttributedString। घोषणाएँ बहुत समान हैं:

// Create a blank attributed string
let mutableAttrString1 = NSMutableAttributedString()

// Initialize with a string only
let mutableAttrString2 = NSMutableAttributedString(string: "Hello.")

// Initialize with a string and inline attribute(s)
let mutableAttrString3 = NSMutableAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])

// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)

एक परिवर्तित स्ट्रिंग को बदलना

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

पहले NSMutableAttributedStringएक नए फ़ॉन्ट विशेषता के साथ बनाएँ ।

let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )

यदि आप साथ काम कर रहे हैं , तो इस तरह से UITextView(या UILabel) को जिम्मेदार स्ट्रिंग सेट करें:

textView.attributedText = myString

आप उपयोग नहीं करते textView.text

यहाँ परिणाम है:

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

फिर एक और जिम्मेदार स्ट्रिंग संलग्न करें जिसमें कोई विशेषता सेट नहीं है। (ध्यान दें कि भले ही मैं ऊपर letघोषित करता था myString, फिर भी मैं इसे संशोधित कर सकता हूं क्योंकि यह एक है NSMutableAttributedString। यह मेरे लिए अनुचित है, लेकिन अगर भविष्य में यह बदलता है तो मुझे आश्चर्य नहीं होगा। ऐसा होने पर मुझे एक टिप्पणी छोड़ दें।)

let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)

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

अगला हम केवल "स्ट्रिंग्स" शब्द का चयन करेंगे, जो सूचकांक में शुरू होता है 17और जिसकी लंबाई होती है 7। ध्यान दें कि यह एक है NSRangeऔर स्विफ्ट नहीं है Range। ( रेंज के बारे में अधिक के लिए यह उत्तर देखें ।) addAttributeविधि हमें पहले स्थान पर विशेषता कुंजी नाम, दूसरे स्थान में विशेषता मान और तीसरे स्थान में सीमा देती है।

var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red, range: myRange)

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

अंत में, आइए पृष्ठभूमि का रंग जोड़ें। विविधता के लिए, आइए addAttributesविधि का उपयोग करें (नोट करें s)। मैं इस पद्धति से एक बार में कई विशेषताओं को जोड़ सकता हूं, लेकिन मैं सिर्फ एक को फिर से जोड़ दूंगा।

myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)

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

ध्यान दें कि विशेषताएँ कुछ स्थानों पर अतिव्यापी हैं। एक विशेषता जोड़ना उस विशेषता को अधिलेखित नहीं करता है जो पहले से है।

सम्बंधित

आगे की पढाई


4
ध्यान दें कि आप को रेखांकित, उदाहरण के लिए कई शैलियों को जोड़ सकते हैंNSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue
Beeb

3
आप NSAttributedString पर appendAttributedString का उपयोग नहीं कर सकते हैं यह NSMutableAttributedString पर होना चाहिए, क्या आप इसे प्रतिबिंबित करने के लिए अपना उत्तर अपडेट कर सकते हैं?
जोसेफ एस्ट्राहन

3
1) आपके उत्तर के लिए सुपर धन्यवाद। 2) मेरा सुझाव है कि आप रखेंगे textView.atrributedtText = myStringया myLabel.attributedText = myStringपर शुरुआत अपने जवाब की। एक नौसिखिया के रूप में मैं बस कर रहा था myLabel.textऔर मुझे नहीं लगा कि मुझे आपके सभी उत्तर से गुजरने की ज़रूरत है । ** 3) ** इसका मतलब यह है कि आपके पास या तो हो सकता है attributedTextया textउन दोनों के रूप में अर्थहीन होगा? 4) मेरा सुझाव है कि आप अपने उत्तर में भी इसlineSpacing तरह का उदाहरण शामिल करें क्योंकि यह बहुत उपयोगी है। 5) чаар дахин
हनी

1
पहले अपेंड और ऐड में अंतर भ्रामक था। appendAttributedString'स्ट्रिंग कॉन्सेप्टन' जैसा है। addAttributeआपके स्ट्रिंग में एक नई विशेषता जोड़ रहा है।
हनी

2
@ डैनियल, addAttributeकी एक विधि है NSMutableAttributedString। आप सही हैं कि आप इसके साथ Stringया इसका उपयोग नहीं कर सकते NSAttributedString। ( इस पद myStringके बदलते स्ट्रिंग खंड में परिभाषा की जाँच करें । मुझे लगता है कि मैंने आपको फेंक दिया क्योंकि मैंने myStringपोस्ट के पहले भाग में चर नाम के लिए भी उपयोग किया था जहां यह एक था NSAttributedString।)
Suragch

114

स्विफ्ट उसी का उपयोग करती है NSMutableAttributedStringजो ओबज-सी करता है। आप इसे स्ट्रिंग के रूप में परिकलित मान में उत्तीर्ण करते हैं:

var attributedString = NSMutableAttributedString(string:"\(calculatedCoffee)")

अब एट्रिब्यूट gस्ट्रिंग (हेह) बनाएं । नोट: UIFont.systemFontOfSize(_) अब एक फाल्ट इनिशियलाइज़र है, इसलिए इसे इस्तेमाल करने से पहले आपको इसे खोलना होगा:

var attrs = [NSFontAttributeName : UIFont.systemFontOfSize(19.0)!]
var gString = NSMutableAttributedString(string:"g", attributes:attrs)

और फिर इसे जोड़ें:

attributedString.appendAttributedString(gString)

आप इस तरह NSAttributedString प्रदर्शित करने के लिए UILabel सेट कर सकते हैं:

myLabel.attributedText = attributedString

//Part 1 Set Up The Lower Case g var coffeeText = NSMutableAttributedString(string:"\(calculateCoffee())") //Part 2 set the font attributes for the lower case g var coffeeTypeFaceAttributes = [NSFontAttributeName : UIFont.systemFontOfSize(18)] //Part 3 create the "g" character and give it the attributes var coffeeG = NSMutableAttributedString(string:"g", attributes:coffeeTypeFaceAttributes) जब मैंने अपना UILabel.text = CoffeeText सेट किया तो मुझे एक त्रुटि मिलती है "NSMutableAttributedString 'String' के लिए परिवर्तनीय नहीं है। क्या UILabel को NSMutableAttributedString स्वीकार करने का कोई तरीका है?
dcbenji

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

1
यह ठीक से काम किया और मेरा निचला मामला "जी" अब मेरे कॉफी राशि पाठ के अंत में दिखाई दे रहा है
dcbenji

2
किसी कारण से मुझे NSAttributedString के साथ अपनी लाइन पर "कॉल में अतिरिक्त तर्क" में एक त्रुटि मिलती है। यह केवल तब होता है जब मैं UIFont.systemFontOfSize (18) को UIFont (नाम: "एरियल", आकार: 20) पर स्विच करता हूं। कोई विचार?
अनोम

UIFont (नाम: आकार :) एक प्रारंभिक आरम्भिक है और शून्य वापस आ सकता है। आप या तो स्पष्ट रूप से जोड़कर इसे खोल सकते हैं! अंत में या इसे शब्दकोश में डालने से पहले एक if / let स्टेटमेंट के साथ एक चर में बाँध दें।
ऐश

21

Xcode 6 संस्करण :

let attriString = NSAttributedString(string:"attriString", attributes:
[NSForegroundColorAttributeName: UIColor.lightGrayColor(), 
            NSFontAttributeName: AttriFont])

Xcode 9.3 संस्करण :

let attriString = NSAttributedString(string:"attriString", attributes:
[NSAttributedStringKey.foregroundColor: UIColor.lightGray, 
            NSAttributedStringKey.font: AttriFont])

Xcode 10, iOS 12, स्विफ्ट 4 :

let attriString = NSAttributedString(string:"attriString", attributes:
[NSAttributedString.Key.foregroundColor: UIColor.lightGray, 
            NSAttributedString.Key.font: AttriFont])

20

स्विफ्ट 4:

let attributes = [NSAttributedStringKey.font: UIFont(name: "HelveticaNeue-Bold", size: 17)!, 
                  NSAttributedStringKey.foregroundColor: UIColor.white]

यह संकलित नहीं करताType 'NSAttributedStringKey' (aka 'NSString') has no member 'font'
bibscy

मैंने अभी इसे नए XCode (10 बीटा 6) में आज़माया है और यह संकलन करता है, क्या आप सुनिश्चित हैं कि आप स्विफ्ट 4 का उपयोग कर रहे हैं?
एडम बार्डन

मैं स्विफ्ट 3 का उपयोग कर रहा हूं
bibscy

4
खैर यह मुद्दा है, मेरे जवाब में बोल्ड शीर्षक "स्विफ्ट 4" है, मैं आपको सुझाव देता हूं कि आप स्विफ्ट 4 को अपडेट करें
एडम बार्डन

@bibscy आप NSAttributedString.Key का उपयोग कर सकते हैं। ***
हातिम

19

मैं जिम्मेदार तार के लिए एक पुस्तकालय का उपयोग करने की अत्यधिक अनुशंसा करूंगा। जब आप चाहते हैं तो यह बहुत आसान हो जाता है, उदाहरण के लिए, चार अलग-अलग रंगों और चार अलग-अलग फोंट के साथ एक स्ट्रिंग। यहाँ मेरा पसंदीदा है। इसे SwiftyAttributes कहा जाता है

यदि आप SwiftyAttributes का उपयोग करके चार अलग-अलग रंगों और विभिन्न फोंट के साथ एक स्ट्रिंग बनाना चाहते हैं:

let magenta = "Hello ".withAttributes([
    .textColor(.magenta),
    .font(.systemFont(ofSize: 15.0))
    ])
let cyan = "Sir ".withAttributes([
    .textColor(.cyan),
    .font(.boldSystemFont(ofSize: 15.0))
    ])
let green = "Lancelot".withAttributes([
    .textColor(.green),
    .font(.italicSystemFont(ofSize: 15.0))

    ])
let blue = "!".withAttributes([
    .textColor(.blue),
    .font(.preferredFont(forTextStyle: UIFontTextStyle.headline))

    ])
let finalString = magenta + cyan + green + blue

finalString के रूप में दिखाएगा

छवि के रूप में दिखाता है


15

स्विफ्ट: xcode 6.1

    let font:UIFont? = UIFont(name: "Arial", size: 12.0)

    let attrString = NSAttributedString(
        string: titleData,
        attributes: NSDictionary(
            object: font!,
            forKey: NSFontAttributeName))

10

IOS पर Attributed Strings को अप्रोच करने का सबसे अच्छा तरीका है कि आप इंटरफ़ेस बिल्डर में बिल्ट-इन अटैच्ड टेक्स्ट एडिटर का उपयोग करें और अपनी सोर्स फाइल्स में NSAtrributedStringKeys के अनसेक्शुअल हार्डकोडिंग से बचें।

आप बाद में गतिशील रूप से इस एक्सटेंशन का उपयोग करके रनटाइम पर प्लेसहोल्डर को बदल सकते हैं:

extension NSAttributedString {
    func replacing(placeholder:String, with valueString:String) -> NSAttributedString {

        if let range = self.string.range(of:placeholder) {
            let nsRange = NSRange(range,in:valueString)
            let mutableText = NSMutableAttributedString(attributedString: self)
            mutableText.replaceCharacters(in: nsRange, with: valueString)
            return mutableText as NSAttributedString
        }
        return self
    }
}

इस तरह दिखने वाले टेक्स्ट को स्टोरीबोर्ड लेबल जोड़ें।

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

फिर आप बस हर बार इस तरह से मूल्य का अद्यतन करें:

label.attributedText = initalAttributedString.replacing(placeholder: "<price>", with: newValue)

मूल मान को initalAttributedString में सहेजना सुनिश्चित करें।

आप इस लेख को पढ़कर इस दृष्टिकोण को बेहतर ढंग से समझ सकते हैं: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e


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

यह एक्सटेंशन मेरे लिए पूरी तरह से काम करता था, लेकिन Xcode 11 में इसने मेरे ऐप को let nsRange = NSRange(range,in:valueString)लाइन में क्रैश कर दिया ।
लुकास पी।

9

स्विफ्ट 2.0

यहाँ एक नमूना है:

let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue], range: NSMakeRange(4, 4))
sampleLabel.attributedText = newsString.copy() as? NSAttributedString

स्विफ्ट 5.x

let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
newsString.addAttributes([NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue], range: NSMakeRange(4, 4))
sampleLabel.attributedText = newsString.copy() as? NSAttributedString

या

let stringAttributes = [
    NSFontAttributeName : UIFont(name: "Helvetica Neue", size: 17.0)!,
    NSUnderlineStyleAttributeName : 1,
    NSForegroundColorAttributeName : UIColor.orangeColor(),
    NSTextEffectAttributeName : NSTextEffectLetterpressStyle,
    NSStrokeWidthAttributeName : 2.0]
let atrributedString = NSAttributedString(string: "Sample String: Attributed", attributes: stringAttributes)
sampleLabel.attributedText = atrributedString

8

बीटा 6 में अच्छी तरह से काम करता है

let attrString = NSAttributedString(
    string: "title-title-title",
    attributes: NSDictionary(
       object: NSFont(name: "Arial", size: 12.0), 
       forKey: NSFontAttributeName))

7

मैंने एक ऑनलाइन टूल बनाया जो आपकी समस्या को हल करने वाला है! आप अपने स्ट्रिंग को लिख सकते हैं और शैलियों को ग्राफिक रूप से लागू कर सकते हैं और टूल आपको उस स्ट्रिंग को उत्पन्न करने के लिए उद्देश्य-सी और स्विफ्ट कोड देता है।

खुला स्रोत भी है, इसलिए इसे बढ़ाने और पीआर भेजने के लिए स्वतंत्र महसूस करें।

ट्रांसफार्मर का उपकरण

Github

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


मेरे लिए काम नहीं कर रहा है। यह बस किसी भी शैली को लागू किए बिना कोष्ठक में सब कुछ लपेटता है।
डैनियल स्प्रिंगर

5
func decorateText(sub:String, des:String)->NSAttributedString{
    let textAttributesOne = [NSAttributedStringKey.foregroundColor: UIColor.darkText, NSAttributedStringKey.font: UIFont(name: "PTSans-Bold", size: 17.0)!]
    let textAttributesTwo = [NSAttributedStringKey.foregroundColor: UIColor.black, NSAttributedStringKey.font: UIFont(name: "PTSans-Regular", size: 14.0)!]

    let textPartOne = NSMutableAttributedString(string: sub, attributes: textAttributesOne)
    let textPartTwo = NSMutableAttributedString(string: des, attributes: textAttributesTwo)

    let textCombination = NSMutableAttributedString()
    textCombination.append(textPartOne)
    textCombination.append(textPartTwo)
    return textCombination
}

// कार्यान्वयन

cell.lblFrom.attributedText = decorateText(sub: sender!, des: " - \(convertDateFormatShort3(myDateString: datetime!))")

5

स्विफ्ट 5 और उससे ऊपर

   let attributedString = NSAttributedString(string:"targetString",
                                   attributes:[NSAttributedString.Key.foregroundColor: UIColor.lightGray,
                                               NSAttributedString.Key.font: UIFont(name: "Arial", size: 18.0) as Any])

4

स्विफ्ट 4

let attributes = [NSAttributedStringKey.font : UIFont(name: CustomFont.NAME_REGULAR.rawValue, size: CustomFontSize.SURVEY_FORM_LABEL_SIZE.rawValue)!]

let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes)

आपको स्विफ्ट 4 में कच्चे मूल्य को निकालने की आवश्यकता है


3

विशिष्ट रंग या संपत्ति सेट करते समय मेरे लिए उपरोक्त समाधान काम नहीं करते थे।

इसने काम किया:

let attributes = [
    NSFontAttributeName : UIFont(name: "Helvetica Neue", size: 12.0)!,
    NSUnderlineStyleAttributeName : 1,
    NSForegroundColorAttributeName : UIColor.darkGrayColor(),
    NSTextEffectAttributeName : NSTextEffectLetterpressStyle,
    NSStrokeWidthAttributeName : 3.0]

var atriString = NSAttributedString(string: "My Attributed String", attributes: attributes)

3

स्विफ्ट 2.1 - एक्सकोड 7

let labelFont = UIFont(name: "HelveticaNeue-Bold", size: 18)
let attributes :[String:AnyObject] = [NSFontAttributeName : labelFont!]
let attrString = NSAttributedString(string:"foo", attributes: attributes)
myLabel.attributedText = attrString

स्विफ्ट 2.0 और 2.1 के बीच क्या बदलाव किए गए थे?
सुरगाछ

3

इस सैंपल कोड का उपयोग करें। अपनी आवश्यकता को प्राप्त करने के लिए यह बहुत छोटा कोड है। यह मेरे लिए काम कर रहा है।

let attributes = [NSAttributedStringKey.font : UIFont(name: CustomFont.NAME_REGULAR.rawValue, size: CustomFontSize.SURVEY_FORM_LABEL_SIZE.rawValue)!]

let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes)

2
extension UILabel{
    func setSubTextColor(pSubString : String, pColor : UIColor){    
        let attributedString: NSMutableAttributedString = self.attributedText != nil ? NSMutableAttributedString(attributedString: self.attributedText!) : NSMutableAttributedString(string: self.text!);

        let range = attributedString.mutableString.range(of: pSubString, options:NSString.CompareOptions.caseInsensitive)
        if range.location != NSNotFound {
            attributedString.addAttribute(NSForegroundColorAttributeName, value: pColor, range: range);
        }
        self.attributedText = attributedString
    }
}

cell.IBLabelGuestAppointmentTime.text = "\ n \ n \ n \ nuest1 \ n8: 00 am \ n \ nGuest2 \ n9: 00Am \ n \ n" सेल। .setSubTextColor (pSubString: "Guest2", pColor: UIColor.red)
दीपक पंचासरा

1
एसओ में आपका स्वागत है। कृपया अपना कोड प्रारूपित करें, और अपने उत्तर में कुछ स्पष्टीकरण / संदर्भ जोड़ें। देखें: stackoverflow.com/help/how-to-answer
Uwe Allner

2

विशेषताएँ स्विफ्ट 3 में सीधे सेट की जा सकती हैं ...

    let attributes = NSAttributedString(string: "String", attributes: [NSFontAttributeName : UIFont(name: "AvenirNext-Medium", size: 30)!,
         NSForegroundColorAttributeName : UIColor .white,
         NSTextEffectAttributeName : NSTextEffectLetterpressStyle])

फिर विशेषताओं के साथ किसी भी वर्ग में चर का उपयोग करें


2

स्विफ्ट 4.2

extension UILabel {

    func boldSubstring(_ substr: String) {
        guard substr.isEmpty == false,
            let text = attributedText,
            let range = text.string.range(of: substr, options: .caseInsensitive) else {
                return
        }
        let attr = NSMutableAttributedString(attributedString: text)
        let start = text.string.distance(from: text.string.startIndex, to: range.lowerBound)
        let length = text.string.distance(from: range.lowerBound, to: range.upperBound)
        attr.addAttributes([NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: self.font.pointSize)],
                           range: NSMakeRange(start, length))
        attributedText = attr
    }
}

लंबाई के लिए केवल सीमा क्यों नहीं।
सिंह डबस 29'18

2

विवरण

  • स्विफ्ट 5.2, Xcode 11.4 (11E146)

समाधान

protocol AttributedStringComponent {
    var text: String { get }
    func getAttributes() -> [NSAttributedString.Key: Any]?
}

// MARK: String extensions

extension String: AttributedStringComponent {
    var text: String { self }
    func getAttributes() -> [NSAttributedString.Key: Any]? { return nil }
}

extension String {
    func toAttributed(with attributes: [NSAttributedString.Key: Any]?) -> NSAttributedString {
        .init(string: self, attributes: attributes)
    }
}

// MARK: NSAttributedString extensions

extension NSAttributedString: AttributedStringComponent {
    var text: String { string }

    func getAttributes() -> [Key: Any]? {
        if string.isEmpty { return nil }
        var range = NSRange(location: 0, length: string.count)
        return attributes(at: 0, effectiveRange: &range)
    }
}

extension NSAttributedString {

    convenience init?(from attributedStringComponents: [AttributedStringComponent],
                      defaultAttributes: [NSAttributedString.Key: Any],
                      joinedSeparator: String = " ") {
        switch attributedStringComponents.count {
        case 0: return nil
        default:
            var joinedString = ""
            typealias SttributedStringComponentDescriptor = ([NSAttributedString.Key: Any], NSRange)
            let sttributedStringComponents = attributedStringComponents.enumerated().flatMap { (index, component) -> [SttributedStringComponentDescriptor] in
                var components = [SttributedStringComponentDescriptor]()
                if index != 0 {
                    components.append((defaultAttributes,
                                       NSRange(location: joinedString.count, length: joinedSeparator.count)))
                    joinedString += joinedSeparator
                }
                components.append((component.getAttributes() ?? defaultAttributes,
                                   NSRange(location: joinedString.count, length: component.text.count)))
                joinedString += component.text
                return components
            }

            let attributedString = NSMutableAttributedString(string: joinedString)
            sttributedStringComponents.forEach { attributedString.addAttributes($0, range: $1) }
            self.init(attributedString: attributedString)
        }
    }
}

प्रयोग

let defaultAttributes = [
    .font: UIFont.systemFont(ofSize: 16, weight: .regular),
    .foregroundColor: UIColor.blue
] as [NSAttributedString.Key : Any]

let marketingAttributes = [
    .font: UIFont.systemFont(ofSize: 20.0, weight: .bold),
    .foregroundColor: UIColor.black
] as [NSAttributedString.Key : Any]

let attributedStringComponents = [
    "pay for",
    NSAttributedString(string: "one",
                       attributes: marketingAttributes),
    "and get",
    "three!\n".toAttributed(with: marketingAttributes),
    "Only today!".toAttributed(with: [
        .font: UIFont.systemFont(ofSize: 16.0, weight: .bold),
        .foregroundColor: UIColor.red
    ])
] as [AttributedStringComponent]
let attributedText = NSAttributedString(from: attributedStringComponents, defaultAttributes: defaultAttributes)

पूर्ण उदाहरण

यहाँ समाधान कोड पेस्ट करना न भूलें

import UIKit

class ViewController: UIViewController {

    private weak var label: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        let label = UILabel(frame: .init(x: 40, y: 40, width: 300, height: 80))
        label.numberOfLines = 2
        view.addSubview(label)
        self.label = label

        let defaultAttributes = [
            .font: UIFont.systemFont(ofSize: 16, weight: .regular),
            .foregroundColor: UIColor.blue
        ] as [NSAttributedString.Key : Any]

        let marketingAttributes = [
            .font: UIFont.systemFont(ofSize: 20.0, weight: .bold),
            .foregroundColor: UIColor.black
        ] as [NSAttributedString.Key : Any]

        let attributedStringComponents = [
            "pay for",
            NSAttributedString(string: "one",
                               attributes: marketingAttributes),
            "and get",
            "three!\n".toAttributed(with: marketingAttributes),
            "Only today!".toAttributed(with: [
                .font: UIFont.systemFont(ofSize: 16.0, weight: .bold),
                .foregroundColor: UIColor.red
            ])
        ] as [AttributedStringComponent]
        label.attributedText = NSAttributedString(from: attributedStringComponents, defaultAttributes: defaultAttributes)
        label.textAlignment = .center
    }
}

परिणाम

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


1

मेरे द्वारा बनाई गई लाइब्रेरी के साथ आपकी समस्या को हल करना वास्तव में आसान होगा। इसे एतवेनिका कहा जाता है।

let calculatedCoffee: Int = 768
let g = Style("g").font(.boldSystemFont(ofSize: 12)).foregroundColor(.red)
let all = Style.font(.systemFont(ofSize: 12))

let str = "\(calculatedCoffee)<g>g</g>".style(tags: g)
    .styleAll(all)
    .attributedString

label.attributedText = str

768g

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



1

स्विफ्ट स्विफ्ट के पास वास्तव में बिना किसी काम के ऐसा करने का एक बहुत ही प्यारा तरीका है। बस उस पैटर्न को प्रदान करें जिसे मिलान किया जाना चाहिए और उस पर क्या विशेषताएँ लागू होनी चाहिए। वे बहुत सी चीजों के लिए महान हैं उन्हें बाहर की जाँच करें।

``` Swift
let defaultGenreText = NSAttributedString(string: "Select Genre - Required")
let redGenreText = defaultGenreText.applying(attributes: [NSAttributedString.Key.foregroundColor : UIColor.red], toRangesMatching: "Required")
``

यदि आपके पास कई स्थान हैं जहां यह लागू किया जाएगा और आप केवल विशिष्ट उदाहरणों के लिए ऐसा करना चाहते हैं तो यह विधि काम नहीं करेगी।

आप इसे एक चरण में कर सकते हैं, अलग होने पर पढ़ने में आसान।


0

स्विफ्ट 4.x

let attr = [NSForegroundColorAttributeName:self.configuration.settingsColor, NSFontAttributeName: self.configuration.settingsFont]

let title = NSAttributedString(string: self.configuration.settingsTitle,
                               attributes: attr)

0

स्विफ्ट 3.0 // क्रिएटेड स्ट्रिंग

विशेषताओं को परिभाषित करें

let attributes = [NSAttributedStringKey.font : UIFont.init(name: "Avenir-Medium", size: 13.0)]

0

कृपया Prestyler का उपयोग करने पर विचार करें

import Prestyler
...
Prestyle.defineRule("$", UIColor.red)
label.attributedText = "\(calculatedCoffee) $g$".prestyled()

0

स्विफ्ट 5

    let attrStri = NSMutableAttributedString.init(string:"This is red")
    let nsRange = NSString(string: "This is red").range(of: "red", options: String.CompareOptions.caseInsensitive)
    attrStri.addAttributes([NSAttributedString.Key.foregroundColor : UIColor.red, NSAttributedString.Key.font: UIFont.init(name: "PTSans-Regular", size: 15.0) as Any], range: nsRange)
    self.label.attributedText = attrStri

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


-4
extension String {
//MARK: Getting customized string
struct StringAttribute {
    var fontName = "HelveticaNeue-Bold"
    var fontSize: CGFloat?
    var initialIndexOftheText = 0
    var lastIndexOftheText: Int?
    var textColor: UIColor = .black
    var backGroundColor: UIColor = .clear
    var underLineStyle: NSUnderlineStyle = .styleNone
    var textShadow: TextShadow = TextShadow()

    var fontOfText: UIFont {
        if let font = UIFont(name: fontName, size: fontSize!) {
            return font
        } else {
            return UIFont(name: "HelveticaNeue-Bold", size: fontSize!)!
        }
    }

    struct TextShadow {
        var shadowBlurRadius = 0
        var shadowOffsetSize = CGSize(width: 0, height: 0)
        var shadowColor: UIColor = .clear
    }
}
func getFontifiedText(partOfTheStringNeedToConvert partTexts: [StringAttribute]) -> NSAttributedString {
    let fontChangedtext = NSMutableAttributedString(string: self, attributes: [NSFontAttributeName: UIFont(name: "HelveticaNeue-Bold", size: (partTexts.first?.fontSize)!)!])
    for eachPartText in partTexts {
        let lastIndex = eachPartText.lastIndexOftheText ?? self.count
        let attrs = [NSFontAttributeName : eachPartText.fontOfText, NSForegroundColorAttributeName: eachPartText.textColor, NSBackgroundColorAttributeName: eachPartText.backGroundColor, NSUnderlineStyleAttributeName: eachPartText.underLineStyle, NSShadowAttributeName: eachPartText.textShadow ] as [String : Any]
        let range = NSRange(location: eachPartText.initialIndexOftheText, length: lastIndex - eachPartText.initialIndexOftheText)
        fontChangedtext.addAttributes(attrs, range: range)
    }
    return fontChangedtext
}

}

// इसका उपयोग नीचे की तरह करें

    let someAttributedText = "Some   Text".getFontifiedText(partOfTheStringNeedToConvert: <#T##[String.StringAttribute]#>)

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