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.


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(" prajeet.shrestha@gmail.com ")
        .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
    }
}

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

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

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

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


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)

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)

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

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

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


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 "


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
}

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

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

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)

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

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


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

-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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.