Machen Sie Text mit der zugewiesenen Zeichenfolge schnell fett

99

Ich habe so eine Schnur

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

Ersetzen Sie nun beispielsweise durch eine text1andere Zeichenfolge t 1. Ich kann den Text ersetzen, aber ich kann ihn nicht fett schreiben. Ich möchte den neuen String fett schreiben t 1, damit die endgültige Ausgabe lautet:

@t 1 das ist gut @t 1

Wie kann ich es tun?

Alle Beispiele, die ich sehe, sind in Objective-C, aber ich möchte es in Swift tun.

Danke im Voraus.

user2413621
quelle
1
Sie müssen Ihr Problem zerlegen: Erfahren Sie, wie Sie "fett" schreiben : stackoverflow.com/questions/25199580/… Erfahren Sie, wie Sie Text ersetzen.
Larme
1
Verwenden Sie diese Bibliothek, es ist ganz einfach. github.com/iOSTechHub/AttributedString
Ashish Chauhan

Antworten:

234

Verwendung:

let label = UILabel()
label.attributedText =
    NSMutableAttributedString()
        .bold("Address: ")
        .normal(" Kathmandu, Nepal\n\n")
        .orangeHighlight(" Email: ")
        .blackHighlight(" [email protected] ")
        .bold("\n\nCopyright: ")
        .underlined(" All rights reserved. 2020.")

Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Hier ist eine gute Möglichkeit, eine Kombination aus fettem und normalem Text in einem einzigen Etikett sowie einige andere Bonusmethoden zu erstellen.

Erweiterung: Swift 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
    }
}
Prajeet Shrestha
quelle
ist es nicht für schnelle 2?
Remy Boys
2
Eine kleine Ergänzung : func bold(_ text:String, _ size:CGFloat). Ich habe dem Fettdruck eine Größe hinzugefügt, damit ich ihn von außen steuern kann. Außerdem habe ich die AvenirNext-MediumSchriftart in dieser Funktion verpasst, daher habe ich einige Minuten gebraucht, um zu verstehen, warum ich meine Schriftart nicht sehen kann. Kopf hoch.
Gal
Du hast meinen Tag gerettet, Alter!
oskarko
Vielen Dank! Arbeitete wie Charme :)
Sharad Chauhan
1
Ballay Ballay Sarkaaar: D
Mohsin Khubaib Ahmed
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)

Wenn Sie es einem Label zuweisen möchten:

yourLabel.attributedText = attributedString
Dejan Skledar
quelle
Super Antwort! Vielen Dank!
Hacker_1989
Hinweis: appendAttributedString wurde in .append () umbenannt
Andrea Leganza
28

Bearbeiten / Aktualisieren: Xcode 8.3.2 • Swift 3.1

Wenn Sie HTML und CSS kennen, können Sie damit den Schriftstil, die Farbe und die Größe Ihrer zugewiesenen Zeichenfolge wie folgt steuern:

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
Leo Dabus
quelle
Ich versuche dies in Swift 2 Xcode zu implementieren, aber die Schriftart wird nicht angewendet. Hier ist die <link href=\"https://fonts.googleapis.com/css?family=Frank+Ruhl+Libre\" rel=\"stylesheet\"> <span style=\"font-family: 'Frank Ruhl Libre', sans-serif;\">שלום</span>
Zeichenfolge
Wenn es WebKit verwendet, um HTML-Zeichenfolgen in NSAttributedString zu analysieren, verwenden Sie es vorsichtig in einem Hintergrund-Thread ...
FouZ
Was sind die Vorteile dieses Ansatzes anstelle der Antwort von @prajeet?
Emre Önder
17

Wenn Sie mit lokalisierten Zeichenfolgen arbeiten, können Sie sich möglicherweise nicht darauf verlassen, dass die fett gedruckte Zeichenfolge immer am Ende des Satzes steht. Wenn dies der Fall ist, funktioniert Folgendes gut:

zB Abfrage "bla" stimmt nicht mit Elementen überein

/* 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
Ian
quelle
2
Nach stundenlangem Suchen ist dies die einzige Antwort, die eine Lösung für mein Problem gefunden hat. +1
Super_Simon
9

Ich habe die großartige Antwort von David West erweitert, damit Sie einen String eingeben und ihm alle Teilzeichenfolgen mitteilen können, die Sie ermutigen möchten:

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
}

Und dann nenne es so:

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!)

Dadurch werden alle Teilzeichenfolgen ermutigt, die in der angegebenen Zeichenfolge fett gedruckt werden sollen

Jeremy Bader
quelle
Ist es möglich, dasselbe Wort an zwei verschiedenen Stellen fett zu haben? EX: "Überprüfen Sie in 30 Tagen erneut, um 30 Freunde zu finden". Wie macht man beide "30" fett? Danke im Voraus.
Dian
8

Dies ist der beste Weg, den ich mir ausgedacht habe. Fügen Sie eine Funktion hinzu, die Sie von überall aufrufen können, und fügen Sie sie einer Datei ohne eine Klasse wie Constants.swift hinzu. Anschließend können Sie Wörter in einer beliebigen Zeichenfolge bei zahlreichen Gelegenheiten ermutigen, indem Sie nur EINE Codezeile aufrufen :

So gehen Sie in eine constants.swift-Datei:

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
}

Dann können Sie diese eine Codezeile für jedes UILabel einfach aufrufen:

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)
David West
quelle
8

Aufbauend auf den hervorragenden Antworten von Jeremy Bader und David West, eine Swift 3-Erweiterung:

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
    }
}

Verwendung:

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)
Daniel McLean
quelle
5

Verwendung....

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

zwei Cent...

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)
    }
}
Samuel
quelle
1
iOS 11 oder höher (aufgrund der Verwendung von UIFont.Weight).
Andrea Leganza
4

Ich akzeptiere die Antwort von Prajeet Shrestha in diesem Thread als gültig und möchte seine Lösung mithilfe des Labels erweitern, wenn dies bekannt ist und die Merkmale der Schriftart.

Swift 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
    }
}
JSR - Silicornio
quelle
3

Super einfacher Weg dies zu tun.

    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))

Für weitere Informationen klicken Sie hier: https://github.com/iOSTechHub/AttributedString

Ashish Chauhan
quelle
Wie wäre es mit halb fett?
Houman
Dies sollte die akzeptierte Antwort sein. @Houman verwenden Sie die Bibliothek oben und verwenden Sie die applyMethode mit der gewünschten Schriftart
Zack Shapiro
3

Swift 4 und höher

Für Swift 4 und höher ist das ein guter Weg:

    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

Auf dem Etikett sieht der Text wie folgt aus: "Hi John "

Jonas Deichelmann
quelle
2

Dies könnte nützlich sein

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
}
Martin Jacob
quelle
2

Swift 3.0

Konvertieren Sie HTML in Zeichenfolge und ändern Sie die Schriftart gemäß Ihren Anforderungen.

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)!
}
Mitul Marsoniya
quelle
Sie sollten Ihre Zeichenfolge mit utf8 in Daten konvertieren. Beachten Sie, dass Daten der Sammlung in Swift 3 entsprechen, sodass Sie Daten mit Ihrer String-Utf8-Sammlungsansicht initialisieren Data("I'm a normal text and <b>this is my bold part . </b>And I'm again in the normal text".utf8)und die Zeichenkodierung in Optionen [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue]
festlegen
0

Verwenden Sie einfach Code wie folgt:

 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
Michał Ziobro
quelle
0

Zwei Liner in Swift 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)
Antzi
quelle
0

Swift 5.1 verwenden NSAttributedString.KeystattNSAttributedStringKey

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
Yodagama
quelle
0

Für -> Fernsehen nach Größe suchen

1-Wege mit NString und seiner Reichweite

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

eine andere ohne Verwendung von NString und seiner Reichweite

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

Vinoth Anandan
quelle
-1

Verbesserung der Antwort von Prajeet Shrestha: -

Sie können eine generische Erweiterung für NSMutableAttributedString erstellen, die weniger Code enthält. In diesem Fall habe ich mich für die Verwendung der Systemschrift entschieden, aber Sie können diese anpassen, um den Namen der Schrift als Parameter einzugeben.

    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
        }
    }
Edward
quelle
-1

Sie können dies mit einer einfachen benutzerdefinierten Methode tun, die unten beschrieben wird. Sie haben im ersten Parameter eine ganze Zeichenfolge und im zweiten Parameter einen fett gedruckten Text angegeben. Hoffe das wird helfen.

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
    }

Verwendung: initalString = Ich bin ein Junge

label.attributedText = getAttributedBoldString (str: initalString, boldTxt: "Boy")

resultierende Zeichenfolge = Ich bin ein Junge

Muhammad Haroon Iqbal
quelle