टेक्स्ट को बोल्ड बनाने के लिए स्विफ्ट में जिम्मेदार स्ट्रिंग का उपयोग करना


100

मेरे पास एक स्ट्रिंग है जैसे

var str = "@text1 this is good @text1"

अब text1एक और स्ट्रिंग के साथ बदलें , कहते हैं t 1। मैं पाठ को बदलने में सक्षम हूं, लेकिन मैं इसे बोल्ड करने में सक्षम नहीं हूं। मैं नई स्ट्रिंग को बोल्ड करना चाहता हूं t 1, ताकि अंतिम आउटपुट होगा:

@ टी 1 यह अच्छा है @ टी 1

मैं यह कैसे कर सकता हूं?

मेरे द्वारा देखे जा रहे सभी उदाहरण ऑब्जेक्टिव-सी में हैं, लेकिन मैं इसे स्विफ्ट में करना चाहता हूं।

अग्रिम में धन्यवाद।


1
आपको समस्या का समाधान करने की आवश्यकता है: जानें कि "बोल्ड" कैसे करें : stackoverflow.com/questions/25199580/… पाठ को बदलना सीखें।
लार्मे

1
इस लाइब्रेरी का उपयोग करें, यह बहुत आसान है। github.com/iOSTechHub/AttributedString
आशीष चौहान

जवाबों:


236

उपयोग:

let label = UILabel()
label.attributedText =
    NSMutableAttributedString()
        .bold("Address: ")
        .normal(" Kathmandu, Nepal\n\n")
        .orangeHighlight(" Email: ")
        .blackHighlight(" prajeet.shrestha@gmail.com ")
        .bold("\n\nCopyright: ")
        .underlined(" All rights reserved. 2020.")

परिणाम:

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

यहां एक एकल लेबल और कुछ अन्य बोनस विधियों में बोल्ड और सामान्य ग्रंथों के संयोजन को बनाने का एक अच्छा तरीका है।

एक्सटेंशन: स्विफ्ट 5. *

extension NSMutableAttributedString {
    var fontSize:CGFloat { return 14 }
    var boldFont:UIFont { return UIFont(name: "AvenirNext-Bold", size: fontSize) ?? UIFont.boldSystemFont(ofSize: fontSize) }
    var normalFont:UIFont { return UIFont(name: "AvenirNext-Regular", size: fontSize) ?? UIFont.systemFont(ofSize: fontSize)}

    func bold(_ value:String) -> NSMutableAttributedString {

        let attributes:[NSAttributedString.Key : Any] = [
            .font : boldFont
        ]

        self.append(NSAttributedString(string: value, attributes:attributes))
        return self
    }

    func normal(_ value:String) -> NSMutableAttributedString {

        let attributes:[NSAttributedString.Key : Any] = [
            .font : normalFont,
        ]

        self.append(NSAttributedString(string: value, attributes:attributes))
        return self
    }
    /* Other styling methods */
    func orangeHighlight(_ value:String) -> NSMutableAttributedString {

        let attributes:[NSAttributedString.Key : Any] = [
            .font :  normalFont,
            .foregroundColor : UIColor.white,
            .backgroundColor : UIColor.orange
        ]

        self.append(NSAttributedString(string: value, attributes:attributes))
        return self
    }

    func blackHighlight(_ value:String) -> NSMutableAttributedString {

        let attributes:[NSAttributedString.Key : Any] = [
            .font :  normalFont,
            .foregroundColor : UIColor.white,
            .backgroundColor : UIColor.black

        ]

        self.append(NSAttributedString(string: value, attributes:attributes))
        return self
    }

    func underlined(_ value:String) -> NSMutableAttributedString {

        let attributes:[NSAttributedString.Key : Any] = [
            .font :  normalFont,
            .underlineStyle : NSUnderlineStyle.single.rawValue

        ]

        self.append(NSAttributedString(string: value, attributes:attributes))
        return self
    }
}

क्या यह स्विफ्ट 2 के लिए नहीं है?
रेमी बॉयज़ 12

2
एक छोटा सा जोड़ func bold(_ text:String, _ size:CGFloat):। मैंने आकार बोल्ड में जोड़ा ताकि मैं इसे बाहर से नियंत्रित कर सकूं। इसके अलावा, मुझे AvenirNext-Mediumइस फंक्शन में फॉन्ट की कमी महसूस हुई, इसलिए मुझे यह समझने में कुछ मिनट लगे कि मैं अपना फॉन्ट क्यों नहीं देख सकता। सचेत।
गैल

तुमने मेरा दिन बचाया, यार!
ऑस्करको

धन्यवाद! आकर्षण की तरह काम किया :)
शरद चौहान

1
बलाय बलाय सरकार: डी
मोहसिन ख़ुबीब अहमद

102
var normalText = "Hi am normal"

var boldText  = "And I am BOLD!"

var attributedString = NSMutableAttributedString(string:normalText)

var attrs = [NSFontAttributeName : UIFont.boldSystemFont(ofSize: 15)]
var boldString = NSMutableAttributedString(string: boldText, attributes:attrs)

attributedString.append(boldString)

जब आप इसे किसी लेबल पर असाइन करना चाहते हैं:

yourLabel.attributedText = attributedString

बहुत बढ़िया जवाब! धन्यवाद!
हैकर_1989

ध्यान दें: appendAttributedString का नाम बदलकर .append ()
Andrea Leganza

28

संपादित करें / अद्यतन: Xcode 8.3.2 • स्विफ्ट 3.1

यदि आप HTML और CSS जानते हैं, तो आप इसे फॉन्ट स्टाइल, रंग और आकार को आसानी से फॉलो करने के लिए उपयोग कर सकते हैं:

extension String {
    var html2AttStr: NSAttributedString? {
        return try? NSAttributedString(data: Data(utf8), options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
    }
}

"<style type=\"text/css\">#red{color:#F00}#green{color:#0F0}#blue{color: #00F; font-weight: Bold; font-size: 32}</style><span id=\"red\" >Red,</span><span id=\"green\" > Green </span><span id=\"blue\">and Blue</span>".html2AttStr

मैं इसे स्विफ्ट 2 एक्सकोड में लागू करने की कोशिश कर रहा हूं, लेकिन फ़ॉन्ट लागू नहीं किया जा रहा है। यहाँ स्ट्रिंग है: <link href=\"https://fonts.googleapis.com/css?family=Frank+Ruhl+Libre\" rel=\"stylesheet\"> <span style=\"font-family: 'Frank Ruhl Libre', sans-serif;\">שלום</span>
DaniSmithProductions

अगर यह स्टाइल NSKttributedString में HTML स्ट्रिंग्स को पार्स करने के लिए WebKit का उपयोग करता है, तो इसे एक बैकग्राउंड थ्रेड में उपयोग करके सावधान ...
FouZ

@Prajeet उत्तर के बजाय इस दृष्टिकोण का उपयोग करने के क्या लाभ हैं?
इमर 11nder

17

यदि आप स्थानीयकृत स्ट्रिंग्स के साथ काम कर रहे हैं, तो आप वाक्य के अंत में हमेशा बोल्ड स्ट्रिंग पर भरोसा करने में सक्षम नहीं हो सकते हैं। अगर ऐसा है तो निम्नलिखित अच्छी तरह से काम करता है:

उदाहरण के लिए क्वेरी "blah" किसी भी आइटम से मेल नहीं खाती

/* Create the search query part of the text, e.g. "blah". 
   The variable 'text' is just the value entered by  the user. */
let searchQuery = "\"\(text)\""

/* Put the search text into the message */
let message = "Query \(searchQuery). does not match any items"

/* Find the position of the search string. Cast to NSString as we want
   range to be of type NSRange, not Swift's Range<Index> */
let range = (message as NSString).rangeOfString(searchQuery)

/* Make the text at the given range bold. Rather than hard-coding a text size,
   Use the text size configured in Interface Builder. */
let attributedString = NSMutableAttributedString(string: message)
attributedString.addAttribute(NSFontAttributeName, value: UIFont.boldSystemFontOfSize(label.font.pointSize), range: range)

/* Put the text in a label */
label.attributedText = attributedString

2
घंटों की खोज के बाद, यह एकमात्र उत्तर है जिसने मेरी समस्या का हल ढूंढ लिया। +1
सुपर_समैन

9

मैंने डेविड वेस्ट के महान उत्तर को विस्तारित किया ताकि आप एक स्ट्रिंग का इनपुट कर सकें और इसे उन सभी सब्सट्रिंग्स को बता सकें जो आप करना चाहते हैं:

func addBoldText(fullString: NSString, boldPartsOfString: Array<NSString>, font: UIFont!, boldFont: UIFont!) -> NSAttributedString {
    let nonBoldFontAttribute = [NSFontAttributeName:font!]
    let boldFontAttribute = [NSFontAttributeName:boldFont!]
    let boldString = NSMutableAttributedString(string: fullString as String, attributes:nonBoldFontAttribute)
    for i in 0 ..< boldPartsOfString.count {
        boldString.addAttributes(boldFontAttribute, range: fullString.rangeOfString(boldPartsOfString[i] as String))
    }
    return boldString
}

और फिर इसे इस तरह से कॉल करें:

let normalFont = UIFont(name: "Dosis-Medium", size: 18)
let boldSearchFont = UIFont(name: "Dosis-Bold", size: 18)
self.UILabel.attributedText = addBoldText("Check again in 30 days to find more friends", boldPartsOfString: ["Check", "30 days", "find", "friends"], font: normalFont!, boldFont: boldSearchFont!)

यह आपके द्वारा दिए गए स्ट्रिंग में बोल्ड किए गए सभी सबस्ट्रिंग्स को लागू करेगा


क्या दो अलग-अलग जगहों पर एक ही शब्द बोल्ड होना संभव है? EX: "30 दोस्तों को खोजने के लिए 30 दिनों में फिर से जाँच करें"। आप दोनों को "30" बोल्ड कैसे करेंगे? अग्रिम में धन्यवाद।
डियान

8

यह सबसे अच्छा तरीका है जो मैं लेकर आया हूं। एक समारोह में जोड़ें आप कहीं से भी फोन और Constants.swift की तरह एक वर्ग के बिना एक फ़ाइल में जोड़ने और फिर तुम सिर्फ फोन करके किसी भी स्ट्रिंग के भीतर शब्द प्रोत्साहित कर सकते हैं कई अवसरों पर, कर सकते हैं एक पंक्ति कोड :

एक constants.swift फ़ाइल में जाने के लिए:

import Foundation
import UIKit

func addBoldText(fullString: NSString, boldPartOfString: NSString, font: UIFont!, boldFont: UIFont!) -> NSAttributedString {
   let nonBoldFontAttribute = [NSFontAttributeName:font!]
   let boldFontAttribute = [NSFontAttributeName:boldFont!]
   let boldString = NSMutableAttributedString(string: fullString as String, attributes:nonBoldFontAttribute)
   boldString.addAttributes(boldFontAttribute, range: fullString.rangeOfString(boldPartOfString as String))
   return boldString
}

तब आप किसी भी यूइलबेल के लिए कोड की इस एक लाइन को कॉल कर सकते हैं:

self.UILabel.attributedText = addBoldText("Check again in 30 DAYS to find more friends", boldPartOfString: "30 DAYS", font: normalFont!, boldFont: boldSearchFont!)


//Mark: Albeit that you've had to define these somewhere:

let normalFont = UIFont(name: "INSERT FONT NAME", size: 15)
let boldFont = UIFont(name: "INSERT BOLD FONT", size: 15)

8

जेरेमी बैडर और डेविड वेस्ट के उत्कृष्ट उत्तरों पर बिल्डिंग, एक स्विफ्ट 3 एक्सटेंशन:

extension String {
    func withBoldText(boldPartsOfString: Array<NSString>, font: UIFont!, boldFont: UIFont!) -> NSAttributedString {
        let nonBoldFontAttribute = [NSFontAttributeName:font!]
        let boldFontAttribute = [NSFontAttributeName:boldFont!]
        let boldString = NSMutableAttributedString(string: self as String, attributes:nonBoldFontAttribute)
        for i in 0 ..< boldPartsOfString.count {
            boldString.addAttributes(boldFontAttribute, range: (self as NSString).range(of: boldPartsOfString[i] as String))
        }
        return boldString
    }
}

उपयोग:

let label = UILabel()
let font = UIFont(name: "AvenirNext-Italic", size: 24)!
let boldFont = UIFont(name: "AvenirNext-BoldItalic", size: 24)!
label.attributedText = "Make sure your face is\nbrightly and evenly lit".withBoldText(
    boldPartsOfString: ["brightly", "evenly"], font: font, boldFont: boldFont)

5

उपयोग ....

let attrString = NSMutableAttributedString()
            .appendWith(weight: .semibold, "almost bold")
            .appendWith(color: .white, weight: .bold, " white and bold")
            .appendWith(color: .black, ofSize: 18.0, " big black")

दो सेंट ...

extension NSMutableAttributedString {

    @discardableResult func appendWith(color: UIColor = UIColor.darkText, weight: UIFont.Weight = .regular, ofSize: CGFloat = 12.0, _ text: String) -> NSMutableAttributedString{
        let attrText = NSAttributedString.makeWith(color: color, weight: weight, ofSize:ofSize, text)
        self.append(attrText)
        return self
    }

}
extension NSAttributedString {

    public static func makeWith(color: UIColor = UIColor.darkText, weight: UIFont.Weight = .regular, ofSize: CGFloat = 12.0, _ text: String) -> NSMutableAttributedString {

        let attrs = [NSAttributedStringKey.font: UIFont.systemFont(ofSize: ofSize, weight: weight), NSAttributedStringKey.foregroundColor: color]
        return NSMutableAttributedString(string: text, attributes:attrs)
    }
}

1
iOS 11 या उससे अधिक (UIFont.Weight उपयोग के कारण)।
एंड्रिया लेगांज़ा

4

इस सूत्र में प्रजीत श्रेष्ठ की प्रतिक्रिया के रूप में मान्य होने पर , मैं लेबल का उपयोग करके उसके समाधान का विस्तार करना चाहूंगा यदि यह ज्ञात है और फ़ॉन्ट के लक्षण हैं।

स्विफ्ट 4

extension NSMutableAttributedString {

    @discardableResult func normal(_ text: String) -> NSMutableAttributedString {
        let normal = NSAttributedString(string: text)
        append(normal)

        return self
    }

    @discardableResult func bold(_ text: String, withLabel label: UILabel) -> NSMutableAttributedString {

        //generate the bold font
        var font: UIFont = UIFont(name: label.font.fontName , size: label.font.pointSize)!
        font = UIFont(descriptor: font.fontDescriptor.withSymbolicTraits(.traitBold) ?? font.fontDescriptor, size: font.pointSize)

        //generate attributes
        let attrs: [NSAttributedStringKey: Any] = [NSAttributedStringKey.font: font]
        let boldString = NSMutableAttributedString(string:text, attributes: attrs)

        //append the attributed text
        append(boldString)

        return self
    }
}

4

स्विफ्ट 4 और उच्चतर

स्विफ्ट 4 और उच्चतर के लिए यह एक अच्छा तरीका है:

    let attributsBold = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16, weight: .bold)]
    let attributsNormal = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16, weight: .regular)]
    var attributedString = NSMutableAttributedString(string: "Hi ", attributes:attributsNormal)
    let boldStringPart = NSMutableAttributedString(string: "John", attributes:attributsBold)
    attributedString.append(boldStringPart)
  
    yourLabel.attributedText = attributedString

लेबल में पाठ ऐसा दिखता है: "हाय जॉन "


3

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

    let text = "This string is having multiple font"
    let attributedText = 
    NSMutableAttributedString.getAttributedString(fromString: text)

    attributedText.apply(font: UIFont.boldSystemFont(ofSize: 24), subString: 
    "This")

    attributedText.apply(font: UIFont.boldSystemFont(ofSize: 24), onRange: 
    NSMakeRange(5, 6))

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


सेमी बोल्ड के बारे में कैसे?
होउमन

यह स्वीकृत उत्तर होना चाहिए। @ आप उपरोक्त पुस्तकालय का उपयोग करें और applyअपनी इच्छित फ़ॉन्ट के साथ विधि का उपयोग करें
Zack Shapiro

2

यह उपयोगी हो सकता है

class func createAttributedStringFrom (string1 : String ,strin2 : String, attributes1 : Dictionary<String, NSObject>, attributes2 : Dictionary<String, NSObject>) -> NSAttributedString{

let fullStringNormal = (string1 + strin2) as NSString
let attributedFullString = NSMutableAttributedString(string: fullStringNormal as String)

attributedFullString.addAttributes(attributes1, range: fullStringNormal.rangeOfString(string1))
attributedFullString.addAttributes(attributes2, range: fullStringNormal.rangeOfString(strin2))
return attributedFullString
}

2

स्विफ्ट 3.0

अपनी आवश्यकता के अनुसार html को स्ट्रिंग और फ़ॉन्ट परिवर्तन में बदलें।

do {

     let str = try NSAttributedString(data: ("I'm a normal text and <b>this is my bold part . </b>And I'm again in the normal text".data(using: String.Encoding.unicode, allowLossyConversion: true)!), options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)

     myLabel.attributedText = str
     myLabel.font =  MONTSERRAT_BOLD(23)
     myLabel.textAlignment = NSTextAlignment.left
} catch {
     print(error)
}


func MONTSERRAT_BOLD(_ size: CGFloat) -> UIFont
{
    return UIFont(name: "MONTSERRAT-BOLD", size: size)!
}

आपको utf8 का उपयोग करके अपने स्ट्रिंग को डेटा में बदलना चाहिए। ध्यान दें कि डेटा स्विफ्ट 3 में संग्रह के अनुरूप है, इसलिए आप अपने स्ट्रिंग utf8 संग्रह दृश्य के साथ डेटा को इनिशियलाइज़ कर सकते हैं Data("I'm a normal text and <b>this is my bold part . </b>And I'm again in the normal text".utf8)और कैरेक्टर एन्कोडिंग को विकल्पों में सेट कर सकते हैं[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue]
लियो डबस

0

बस कुछ इस तरह कोड का उपयोग करें:

 let font = UIFont(name: "Your-Font-Name", size: 10.0)!

        let attributedText = NSMutableAttributedString(attributedString: noteLabel.attributedText!)
        let boldedRange = NSRange(attributedText.string.range(of: "Note:")!, in: attributedText.string)
        attributedText.addAttributes([NSAttributedString.Key.font : font], range: boldedRange)
        noteLabel.attributedText = attributedText

0

स्विफ्ट 4 में दो लाइनर:

            button.setAttributedTitle(.init(string: "My text", attributes: [.font: UIFont.systemFont(ofSize: 20, weight: .bold)]), for: .selected)
            button.setAttributedTitle(.init(string: "My text", attributes: [.font: UIFont.systemFont(ofSize: 20, weight: .regular)]), for: .normal)

0

NSAttributedString.Keyइसके बजाय स्विफ्ट 5.1 का उपयोग करेंNSAttributedStringKey

let test1Attributes:[NSAttributedString.Key: Any] = [.font : UIFont(name: "CircularStd-Book", size: 14)!]
let test2Attributes:[NSAttributedString.Key: Any] = [.font : UIFont(name: "CircularStd-Bold", size: 16)!]

let test1 = NSAttributedString(string: "\(greeting!) ", attributes:test1Attributes)
let test2 = NSAttributedString(string: firstName!, attributes:test2Attributes)
let text = NSMutableAttributedString()

text.append(test1)
text.append(test2)
return text

0

के लिए -> टेलीविजन खोजें आकार से

NString और इसकी रेंज का उपयोग करके 1-रास्ता

let query = "Television"
let headerTitle = "size"
let message = "Search \(query) by \(headerTitle)"
let range = (message as NSString).range(of: query)
let attributedString = NSMutableAttributedString(string: message)
attributedString.addAttribute(NSAttributedString.Key.font, value: UIFont.boldSystemFont(ofSize: label1.font.pointSize), range: range)
label1.attributedText = attributedString

एक और NString और इसकी सीमा का उपयोग किए बिना

let query = "Television"
let headerTitle = "size"
let (searchText, byText) = ("Search ", " by \(headerTitle)")
let attributedString = NSMutableAttributedString(string: searchText)
let byTextAttributedString = NSMutableAttributedString(string: byText)
let attrs = [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: label1.font.pointSize)]
let boldString = NSMutableAttributedString(string: query, attributes:attrs)
attributedString.append(boldString)
attributedString.append(byTextAttributedString)
label1.attributedText = attributedString

swift5


-1

प्रजीत श्रेष्ठ उत्तर पर सुधार: -

आप NSMutableAttributedString के लिए एक सामान्य एक्सटेंशन बना सकते हैं जिसमें कम कोड शामिल है। इस मामले में मैंने सिस्टम फ़ॉन्ट का उपयोग करने के लिए चुना है, लेकिन आप इसे अनुकूलित कर सकते हैं ताकि आप एक पैरामीटर के रूप में फ़ॉन्ट नाम इनपुट कर सकें।

    extension NSMutableAttributedString {

        func systemFontWith(text: String, size: CGFloat, weight: CGFloat) -> NSMutableAttributedString {
            let attributes: [String: AnyObject] = [NSFontAttributeName: UIFont.systemFont(ofSize: size, weight: weight)]
            let string = NSMutableAttributedString(string: text, attributes: attributes)
            self.append(string)
            return self
        }
    }

-1

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

func getAttributedBoldString(str : String, boldTxt : String) -> NSMutableAttributedString {
        let attrStr = NSMutableAttributedString.init(string: str)
        let boldedRange = NSRange(str.range(of: boldTxt)!, in: str)
        attrStr.addAttributes([NSAttributedString.Key.font : UIFont.systemFont(ofSize: 17, weight: .bold)], range: boldedRange)
        return attrStr
    }

उपयोग: initalString = मैं एक लड़का हूं

label.attributedText = getAttributedBoldString (str: initalString, boldTxt: "बॉय बॉय)

परिणामी स्ट्रिंग = मैं एक लड़का हूँ

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