Swift'de atıfta bulunulan dizeyi kullanarak metni kalın yapma


102

Bunun gibi bir dizim var

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

Şimdi text1başka bir dizeyle değiştirin , diyelim t 1. Metni değiştirebiliyorum ama kalın hale getiremiyorum. Yeni dizeyi kalınlaştırmak istiyorum t 1, böylece son çıktı şöyle olacaktır:

@t 1 bu iyi @t 1

Nasıl yapabilirim?

Gördüğüm tüm örnekler Objective-C'de, ancak bunu Swift ile yapmak istiyorum.

Şimdiden teşekkürler.


1
Sorununuzu ayrıştırmanız gerekiyor: Nasıl "kalın" yapacağınızı öğrenin : stackoverflow.com/questions/25199580/… Metni nasıl değiştireceğinizi öğrenin.
Larme

1
Bu kütüphaneyi kullanın, çok basit. github.com/iOSTechHub/AttributedString
Ashish Chauhan 21

Yanıtlar:


240

Kullanım:

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

Sonuç:

görüntü açıklamasını buraya girin

Tek bir etikette kalın ve normal metinlerin bir kombinasyonunu ve diğer bazı bonus yöntemlerini yapmanın düzgün bir yolu.

Uzantı: 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
    }
}

hızlı 2 için değil mi?
remy boys

2
Küçük bir ek: func bold(_ text:String, _ size:CGFloat). Kalınlığa boyut ekledim, böylece onu dışarıdan kontrol edebilirim. Ayrıca, AvenirNext-Mediumbu işlevdeki yazı tipini kaçırdım, bu yüzden yazı tipimi neden göremediğimi anlamam birkaç dakika sürdü. Dikkat et.
Gal

günümü kurtardın ahbap!
oskarko

Teşekkürler! Cazibe gibi çalıştı :)
Sharad Chauhan

1
Ballay ballay sarkaaar: D
Mohsin

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)

Bunu bir etikete atamak istediğinizde:

yourLabel.attributedText = attributedString

Harika cevap! Teşekkürler!
hacker_1989

not: appendAttributedString, .append () olarak yeniden adlandırıldı
Andrea Leganza

28

düzenle / güncelle: Xcode 8.3.2 • Swift 3.1

HTML ve CSS'yi biliyorsanız, atfedilen dizenizin yazı tipi stilini, rengini ve boyutunu aşağıdaki gibi kolayca kontrol etmek için kullanabilirsiniz:

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

Bunu Swift 2 Xcode'da uygulamaya çalışıyorum ancak yazı tipi uygulanmıyor. İşte Dize: <link href=\"https://fonts.googleapis.com/css?family=Frank+Ruhl+Libre\" rel=\"stylesheet\"> <span style=\"font-family: 'Frank Ruhl Libre', sans-serif;\">שלום</span>
DaniSmithProductions

Bu stil, NSAttributedString'de HTML dizelerini ayrıştırmak için WebKit'i kullanıyorsa, arka planda kullanmaya dikkat edin ...
FouZ

@Prajeet yanıtı yerine bu yaklaşımı kullanmanın faydaları nelerdir?
Emre Önder

18

Yerelleştirilmiş dizelerle çalışıyorsanız, kalın dizenin her zaman cümlenin sonunda olmasına güvenemeyebilirsiniz. Bu durumda, aşağıdakiler işe yarar:

örneğin "blah" sorgusu hiçbir öğeyle eşleşmiyor

/* 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
Saatler süren araştırmalardan sonra, sorunuma çözüm bulan tek cevap bu. +1
Super_Simon

9

Bulduğum en iyi yol bu. Herhangi bir yerden çağırabileceğiniz ve Sabitler.swift gibi bir sınıf olmadan bir dosyaya ekleyebileceğiniz bir işlev ekleyin ve ardından herhangi bir dizedeki sözcükleri, birçok durumda, yalnızca BİR HATLI kod çağırarak cesaretlendirebilirsiniz :

Constants.swift dosyasına gitmek için:

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
}

O zaman bunu herhangi bir UILabel için tek satırlık kod çağırabilirsiniz:

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)

9

David West'in harika cevabını genişlettim, böylece bir dize girebilir ve cesaretlendirmek istediğiniz tüm alt dizeleri söyleyebilirsiniz :

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
}

Ve sonra şöyle diyelim:

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

Bu, verdiğiniz dizede kalın olmasını istediğiniz tüm alt dizeleri cesaretlendirir.


Aynı kelimeyi iki farklı yerde kalın kullanmak mümkün müdür? EX: "30 arkadaş bulmak için 30 gün sonra tekrar kontrol edin". Her ikisini de nasıl kalın yaparsınız? Şimdiden teşekkürler.
Dian

8

Jeremy Bader ve David West'in mükemmel yanıtlarına dayanan bir Swift 3 uzantısı:

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

Kullanım:

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

kullanım ....

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

iki sent...

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 veya üstü (UIFont.Weight kullanımı nedeniyle).
Andrea Leganza

5

Swift 4 ve üstü

Swift 4 ve üstü için bu iyi bir yoldur:

    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

Etikette Metin şöyle görünür: "Merhaba John "


4

Prajeet Shrestha'nın bu konudaki yanıtını geçerli olarak kabul ederek, eğer biliniyorsa Label'ı ve fontun özelliklerini kullanarak çözümünü genişletmek istiyorum.

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

Bunu yapmanın süper kolay yolu.

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

Daha fazla ayrıntı için buraya tıklayın: https://github.com/iOSTechHub/AttributedString


Yarı cesur nasıl?
Houman

Kabul edilen cevap bu olmalıdır. @Houman yukarıdaki kitaplığı kullanın ve applyyöntemi istediğiniz yazı tipiyle kullanın
Zack Shapiro

2

Bu yararlı olabilir

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

Gereksiniminize göre html'yi dizeye ve yazı tipi değişikliğine dönüştürün.

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

Dizenizi utf8 kullanarak verilere dönüştürmelisiniz. Verilerin Swift 3'teki koleksiyona uygun olduğunu unutmayın, böylece Verileri dizge utf8 koleksiyon görünümünüzle 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]
başlatabilir

1

İçin -> Televizyonu boyuta göre ara

NString ve Menzilini kullanarak 1 yollu

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

Başka olmadan nSTRING ve Range kullanarak

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


0

Kodu şunun gibi kullanın:

 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

Swift 4'te iki astar:

            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 kullanmak NSAttributedString.KeyyerineNSAttributedStringKey

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

-1

Prajeet Shrestha cevabını geliştirmek: -

NSMutableAttributedString için daha az kod içeren genel bir uzantı oluşturabilirsiniz. Bu durumda, sistem yazı tipini kullanmayı seçtim, ancak yazı tipi adını parametre olarak girebilmeniz için onu uyarlayabilirsiniz.

    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

Bunu aşağıda yazılı basit özel yöntemi kullanarak yapabilirsiniz. İlk parametrede tüm dizeyi ve ikinci parametrede kalın olması için metni verdiniz. Umarım bu yardımcı olur.

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
    }

kullanım: initalString = Ben bir erkeğim

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

sonuç dizesi = Ben bir erkeğim

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.