Swift kullanarak ilişkilendirilmiş bir dizeyi nasıl yapabilirim?


316

Basit bir Kahve Hesap Makinesi yapmaya çalışıyorum. Kahve miktarını gram olarak göstermem gerekiyor. Miktarı görüntülemek için kullandığım UILabel'ımın gram için "g" sembolü eklenmelidir. UILabel numaraları kullanıcı girişi gayet iyi dinamik olarak değişiyor, ama ben güncelleme sayıları farklı biçimlendirilmiş dizenin ucuna küçük harf "g" eklemek gerekir. Sayılara ve konum değiştikçe, "g" "sayılara" hareket eder ". Eminim bu sorun daha önce çözülmüştür, bu yüzden küçük kalbimi googled olarak doğru yönde bir bağlantı yararlı olacaktır.

Nitelikli bir dize için belgeler üzerinden aradım ve hatta app store bir "Attributed String Creator" in aşağı indi, ancak ortaya çıkan kod Objective-C ve Swift kullanıyorum. Harika ve muhtemelen bu dili öğrenen diğer geliştiriciler için yararlı olan şey, Swift'te atfedilen bir dize kullanarak özel niteliklere sahip özel bir yazı tipi oluşturmanın açık bir örneğidir. Bunun için çok açık bir yol olmadığından, bunun için belgeler çok kafa karıştırıcıdır. Planım, ilişkilendirilmiş dizeyi oluşturmak ve bunu coffeeAmount dizemin sonuna eklemek.

var coffeeAmount: String = calculatedCoffee + attributedText

CalcuCoffee bir dizeye dönüştürülmüş bir int ve "attributedText" oluşturmaya çalıştığım özelleştirilmiş yazı tipi ile "g" küçük harfidir. Belki de bunu yanlış şekilde yapıyorum. Herhangi bir yardım takdir!

Yanıtlar:


969

resim açıklamasını buraya girin

Bu yanıt Swift 4.2 için güncellendi.

Hızlı referans

İlişkilendirilmiş bir dizeyi yapmak ve ayarlamak için genel form şöyledir. Aşağıda diğer yaygın seçenekleri bulabilirsiniz.

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

Metin Rengi

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

Arka plan rengi

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

Yazı tipi

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

resim açıklamasını buraya girin

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

resim açıklamasını buraya girin

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

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

Bu yazının geri kalanı, ilgilenenler için daha fazla ayrıntı veriyor.


Öznitellikler

Dize öznitelikleri yalnızca biçimindeki bir sözlüktür [NSAttributedString.Key: Any]; burada NSAttributedString.Keyözniteliğin anahtar adı ve Anybazı Türlerin değeridir. Değer yazı tipi, renk, tamsayı veya başka bir şey olabilir. Swift'te önceden tanımlanmış birçok standart özellik vardır. Örneğin:

  • anahtar adı:, NSAttributedString.Key.fontdeğer: aUIFont
  • anahtar adı:, NSAttributedString.Key.foregroundColordeğer: aUIColor
  • anahtar adı:, NSAttributedString.Key.linkdeğer: an NSURLveyaNSString

Daha birçokları var. Daha fazla bilgi için bu bağlantıya bakın . Kendi özel özelliklerinizi bile oluşturabilirsiniz:

  • anahtar adı:, NSAttributedString.Key.myNamedeğer: bazı Tür.
    bir uzantı yaparsanız :

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

Swift'te özellikler oluşturma

Nitelikleri tıpkı diğer sözlükleri bildirmek gibi bildirebilirsiniz.

// 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" ]

Bunun rawValuealt çizgi stil değeri için gerekli olduğuna dikkat edin.

Öznitelikler yalnızca Sözlük olduğundan, boş bir Sözlük yapıp daha sonra buna anahtar / değer çiftleri ekleyerek bunları oluşturabilirsiniz. Değer birden çok tür içerecekse, tür olarak kullanmanız gerekir Any. İşte multipleAttributesbu şekilde yeniden oluşturulan yukarıdaki örnek:

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

İlişkilendirilmiş Dizeler

Artık öznitelikleri anladığınıza göre, ilişkilendirilmiş dizeler oluşturabilirsiniz.

Başlatma

İlişkilendirilmiş dizeler oluşturmanın birkaç yolu vardır. Sadece salt okunur bir dizeye ihtiyacınız varsa kullanabilirsiniz NSAttributedString. İşte başlatmanın bazı yolları:

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

Daha sonra öznitelikleri veya dize içeriğini değiştirmeniz gerekirse kullanmanız gerekir NSMutableAttributedString. Beyanlar çok benzer:

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

İlişkilendirilmiş Bir Dizeyi Değiştirme

Örnek olarak, bu yayının üstünde ilişkilendirilmiş dizeyi oluşturalım.

Önce NSMutableAttributedStringyeni bir font özniteliği ile bir oluşturun .

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

Birlikte çalışıyorsanız, ilişkilendirilen dizeyi aşağıdaki gibi bir UITextView(veya UILabel) olarak ayarlayın:

textView.attributedText = myString

Sen yok kullanın textView.text.

İşte sonuç:

resim açıklamasını buraya girin

Ardından, ayarlanmış özniteliği olmayan başka bir ilişkilendirilmiş dize ekleyin. ( Yukarıda letbeyan etmiş olmama myStringrağmen, yine de değiştirebilirim çünkü bu bir NSMutableAttributedString.

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

resim açıklamasını buraya girin

Ardından, dizinden başlayan 17ve uzunluğu olan "Dizeler" kelimesini seçeceğiz 7. Bunun NSRangebir Swift değil, bir Swift olduğuna dikkat edin Range. ( Aralıklarla ilgili daha fazla bilgi için bu cevaba bakın .) addAttributeYöntem, özellik anahtarı adını birinci noktaya, özellik değerini ikinci noktaya ve üçüncü noktaya aralığı koymamızı sağlar.

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)

resim açıklamasını buraya girin

Son olarak, bir arka plan rengi ekleyelim. Çeşitlilik için, addAttributesyöntemi kullanalım (not s). Bu yöntemle aynı anda birden fazla özellik ekleyebilirim, ancak yalnızca bir tane ekleyeceğim.

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

resim açıklamasını buraya girin

Özelliklerin bazı yerlerde çakıştığına dikkat edin. Bir öznitelik eklemek, zaten var olan bir özniteliğin üzerine yazmaz.

İlişkili

Daha fazla okuma


4
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue
Alt

3
NSAttributedString üzerinde appendAttributedString'i NSMutableAttributedString üzerinde olması gerektiği gibi kullanamazsınız, cevabınızı bunu yansıtacak şekilde güncelleyebilir misiniz?
Joseph Astrahan

3
1) Cevabınız için süper teşekkürler. 2) Cevabınızın başınatextView.atrributedtText = myString ya myLabel.attributedText = myStringda başında olmanızı öneririm . Bir acemi olarak sadece yapıyordum myLabel.textve tüm cevabınızı atlatmam gerektiğini düşünmedim . ** 3) ** Bu, sadece ikisine de sahip olabileceğiniz ya attributedTextda texther ikisinin de anlamsız olacağı anlamına mı geliyor ? 4) Ben de anonim önerilir lineSpacinggibi örnek bu Yanıtınızda öyle olarak çok faydalıdır. 5) ачаар дахин
Bal

1
Append ve add arasındaki fark önce kafa karıştırıcıydı. appendAttributedString'String bitiştirme' gibidir. addAttributedizenize yeni bir özellik ekliyor.
Bal

2
@Daniel, addAttributebir yöntemdir NSMutableAttributedString. Sen bunu kullanamazsınız haklısın Stringya NSAttributedString. ( myStringBu yazının bir Nitelikli Dize Değiştirme bölümündeki tanımı kontrol edin . Sanırım attım çünkü myStringNSAttributedString
yazının

114

Swift NSMutableAttributedString, Obj-C ile aynı şeyi kullanır . Hesaplanan değeri bir dize olarak ileterek bunu başlatırsınız:

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

Şimdi atfedilen gdizeyi (heh) oluşturun. Not: UIFont.systemFontOfSize(_) şimdi failable başlatıcıdır, bu yüzden kullanmadan önce paketinin açılması gerekir:

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

Ve sonra ekleyin:

attributedString.appendAttributedString(gString)

Daha sonra UILabel'i NSAttributedString öğesini şu şekilde görüntüleyecek şekilde ayarlayabilirsiniz:

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) Benim UILabel.text = coffeeText ayarladığımda bir hata alıyorum "NSMutableAttributedString 'String' dönüştürülemez. UILabel NSMutableAttributedString kabul etmek için bir yolu var mı?
dcbenji

11
İlişkilendirilmiş bir dizeniz olduğunda, etiketin text özelliği yerine attributedText özelliğini ayarlamanız gerekir.
NRitH

1
Bu düzgün çalıştı ve benim küçük harf "g" şimdi kahve miktarı
metnimin

2
Nedense NSAttributedString ile hattımda "çağrıda ekstra argüman" hatası alıyorum. Bu sadece UIFont.systemFontOfSize (18) 'i UIFont (isim: "Arial", boyut: 20) olarak değiştirdiğimde olur. Herhangi bir fikir?
Unome

UIFont (isim: size :) failable başlatıcıdır ve sıfır döndürür. Ekleyerek açıkça açabilirsiniz! veya sözlüğe eklemeden önce if / let deyimine sahip bir değişkene bağlayın.
Ash

21

Xcode 6 sürümü :

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

Xcode 9.3 sürümü :

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

Xcode 10, iOS 12, Swift 4 :

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

20

Hızlı 4:

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

o derleme değilType 'NSAttributedStringKey' (aka 'NSString') has no member 'font'
bibscy

Ben sadece yeni XCode (10 beta 6) denedim ve derleme, Swift 4 kullandığınızdan emin misiniz?
Adam Bardon

Swift 3 kullanıyorum
bibscy

4
Sorun da bu, cevabımın cesur başlığı "Swift 4", Swift 4'e güncellemenizi şiddetle tavsiye ederim
Adam Bardon

@bibscy kullanabilirsiniz NSAttributedString.Key. ***
Hatim

19

Çok ilişkilendirilmiş dizeleri için bir kütüphane kullanmanızı tavsiye ediyoruz. Örneğin, dört farklı renk ve dört farklı yazı tipine sahip bir dize istediğinizde çok daha kolay hale getirir . İşte benim favorim. Buna SwiftyAttributes denir

SwiftyAttributes kullanarak dört farklı renk ve farklı yazı tipi içeren bir dize yapmak istiyorsanız:

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 olarak gösterecekti

Görüntü olarak gösterir


15

Swift: xcode 6.1

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

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

10

İOS'ta İlişkilendirilmiş Dizelere yaklaşmanın en iyi yolu, arayüz oluşturucudaki yerleşik İlişkilendirilmiş Metin düzenleyicisini kullanmak ve kaynak dosyalarınızda gereksiz sabit kodlama NSAtrributedStringKeys kullanmaktan kaçınmaktır.

Daha sonra bu uzantıyı kullanarak çalışma zamanında placehoderls'i dinamik olarak değiştirebilirsiniz:

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

İlişkilendirilmiş metnin böyle göründüğü bir storyboard etiketi ekleyin.

resim açıklamasını buraya girin

Ardından, her ihtiyacınız olduğunda bu değeri güncellersiniz:

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

Orijinal değeri initalAttributedString'e kaydettiğinizden emin olun.

Bu yaklaşımı bu makaleyi okuyarak daha iyi anlayabilirsiniz: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e


Bu, bir Storyboard'um vardı ve sadece bir etikette dizenin bir kısmına kalın eklemek istediğim durumum için gerçekten yararlı oldu. Tüm nitelikleri manuel olarak ayarlamaktan çok daha basittir.
Marc Attinasi

Bu uzantı benim için mükemmel çalışırdı, ancak Xcode 11'de uygulamamı let nsRange = NSRange(range,in:valueString)satırda kilitledi.
Lucas P.

9

Swift 2.0

İşte bir örnek:

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

Swift 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

VEYA

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

Beta 6'da iyi çalışır

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

7

Sorununuzu çözecek çevrimiçi bir araç oluşturdum! Dizenizi yazabilir ve stilleri grafik olarak uygulayabilirsiniz ve araç, bu dizeyi oluşturmak için objektif-c ve hızlı kod verir.

Ayrıca açık kaynak yani genişletmek ve PR göndermek için çekinmeyin.

Transformatör Aracı

Github

resim açıklamasını buraya girin


Benim için çalışmıyor. Herhangi bir stil uygulamadan her şeyi parantez içine alır.
Daniel Springer

6

Swift 5 ve üstü

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

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
}

// Uygulama

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

4

Hızlı 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)

Hızlı 4'te ham değeri kaldırmanız gerekiyor


3

Benim için yukarıdaki çözümler belirli bir renk veya özellik ayarlanırken işe yaramadı.

Bu işe yaradı:

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

Swift 2.1 - Xcode 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

Swift 2.0 ve 2.1 arasında ne gibi değişiklikler yapıldı?
Suresi

3

Bu örnek kodu kullanın. Bu, ihtiyacınızı karşılamak için çok kısa bir koddur. Bu benim için çalışıyor.

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 \ nGuest1 \ n8: 00 am \ n \ nGuest2 \ n9: 00Am \ n \ n" cell.IBLabelGuestAppointmentTime.setSubTextColor (pSubString: "Guest1", pColor: UIColor.estit.Appite.estite.it .setSubTextColor (pSubString: "Konuk2", pColor: UIColor.red)
Dipak Panchasara

1
SO hoş geldiniz. Lütfen kodunuzu biçimlendirin ve yanıtınıza bir açıklama / bağlam ekleyin. Bkz. Stackoverflow.com/help/how-to-answer
Uwe Allner

2

Nitelikler doğrudan hızlı 3 ...

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

Sonra değişkeni nitelikleri olan herhangi bir sınıfta kullanın


2

Hızlı 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
    }
}

Neden sadece range.count uzunluğu için değil?
Leo Dabus

2

ayrıntılar

  • Swift 5.2, Xcode 11.4 (11E146)

Çözüm

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

kullanım

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)

Tam Örnek

çözüm kodunu buraya yapıştırmayı unutmayın

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

Sonuç

resim açıklamasını buraya girin


1

Oluşturduğum kütüphane ile sorununuzu çözmek gerçekten kolay olacak. Buna Atributika denir.

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

Burada bulabilirsiniz https://github.com/psharanda/Atributika


1
 let attrString = NSAttributedString (
            string: "title-title-title",
            attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])

1

Swifter Swift , bunu gerçekten herhangi bir iş yapmadan yapmanın tatlı bir yoluna sahiptir. Eşleşmesi gereken deseni ve ona uygulanacak nitelikleri sağlamanız yeterlidir. Onları kontrol etmek için bir çok şey için harika.

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

Bunun uygulanacağı birden çok yeriniz varsa ve yalnızca belirli örnekler için olmasını istiyorsanız, bu yöntem işe yaramaz.

Bunu tek adımda yapabilirsiniz, ayrıldığında daha kolay okunur.


0

Swift 4.x

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

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

0

Swift 3.0 // ilişkilendirilmiş dize oluştur

Gibi özellikleri tanımlayın

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

0

Lütfen Prestyler kullanmayı düşünün

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

0

Hızlı 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

resim açıklamasını buraya girin


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

}

// Aşağıdaki gibi kullanın

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

2
bu cevap, hızlı bir şekilde ilişkilendirilmiş bir dizenin nasıl yapılacağı dışında bilmeniz gereken her şeyi size söyler.
Eric
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.