Swiftを使用して属性付き文字列を作成するにはどうすればよいですか?


316

簡単なコーヒー計算機を作ろうとしています。コーヒーの量をグラムで表示する必要があります。量の表示に使用しているUILabelにグラムの「g」記号を付ける必要があります。UILabelの数値はユーザー入力によって動的に変化しますが、更新される数値とは異なる形式の文字列の末尾に小文字の「g」を追加する必要があります。数字に「g」を付ける必要があるため、数字のサイズと位置が変わると、「g」が数字とともに「移動」します。私はこの問題が以前に解決されたことを確信しているので、正しい方向へのリンクが私の小さな心をググってみたので役立つでしょう。

ドキュメントを調べて属性付き文字列を探し、「属性付き文字列作成者」をアプリストアからダウンロードしましたが、結果のコードはObjective-Cにあり、Swiftを使用しています。素晴らしい、そしておそらくこの言語を学ぶ他の開発者にとって役立つものは、Swiftの属性付き文字列を使用してカスタム属性を持つカスタムフォントを作成する明確な例です。これを行う方法についての明確なパスがないため、このドキュメントは非常に混乱しています。私の計画は、属性付き文字列を作成し、それをcoffeeAmount文字列の最後に追加することです。

var coffeeAmount: String = calculatedCoffee + attributedText

ここで、calculatedCoffeeは文字列に変換されたIntであり、「attributedText」は、作成しようとしているカスタマイズされたフォントを含む小文字の「g」です。多分私はこれについて間違った方向に進んでいます。どんな助けでもありがたいです!

回答:


970

ここに画像の説明を入力してください

この回答はSwift 4.2で更新されました。

クイックリファレンス

属性付き文字列を作成および設定するための一般的な形式は次のとおりです。他の一般的なオプションを以下に示します。

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

テキストの色

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

背景色

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

フォント

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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

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

この投稿の残りの部分では、興味のある人のための詳細を説明します。


の属性

文字列属性は、の形式の単なる辞書です[NSAttributedString.Key: Any]。ここNSAttributedString.Keyで、は属性のキー名であり、AnyTypeの値です。値には、フォント、色、整数、またはその他の値を使用できます。Swiftには、事前に定義された多くの標準属性があります。例えば:

  • キー名: NSAttributedString.Key.font、値:aUIFont
  • キー名: NSAttributedString.Key.foregroundColor、値:aUIColor
  • キー名:NSAttributedString.Key.link、値:NSURLまたはNSString

他にもたくさんあります。詳細については、このリンクを参照してください。次のような独自のカスタム属性を作成することもできます。

  • キー名:NSAttributedString.Key.myName、値:一部のタイプ。拡張
    を行う場合:

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

Swiftで属性を作成する

他のディクショナリを宣言するのと同じように、属性を宣言できます。

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

注意してください rawValue下線スタイルの値に必要なにて。

属性は単なる辞書であるため、空の辞書を作成し、それにキーと値のペアを追加することで属性を作成することもできます。値に複数のタイプが含まれる場合はAny、タイプとして使用する必要があります。multipleAttributesこの方法で再作成した上記の例を次に示します。

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

属性付き文字列

属性を理解したので、属性付き文字列を作成できます。

初期化

属性付き文字列を作成する方法はいくつかあります。読み取り専用の文字列だけが必要な場合は、を使用できますNSAttributedString。これを初期化する方法は次のとおりです。

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

後で属性または文字列コンテンツを変更する必要がある場合は、を使用する必要がありますNSMutableAttributedString。宣言は非常に似ています:

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

属性付き文字列の変更

例として、この投稿の上部に属性付き文字列を作成してみましょう。

まずNSMutableAttributedString、新しいフォント属性でを作成します。

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

一緒に作業している場合は、属性付き文字列を次のようにUITextView(またはUILabel)に設定します。

textView.attributedText = myString

あなたはしていない使用しますtextView.text

結果は次のとおりです。

ここに画像の説明を入力してください

次に、属性が設定されていない別の属性付き文字列を追加します。(上記でlet宣言していたもののmyString、それがであるため、変更することもできNSMutableAttributedStringます。これは私にとってはあまりスウィフトではないようです。今後この変更があったとしても驚かないでしょう。その場合はコメントを残してください。)

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

ここに画像の説明を入力してください

次に、インデックスから始まり17、長さがの「文字列」という単語を選択します7。これはNSRangeSwiftではなくであることに注意してくださいRange。(範囲の詳細については、この回答を参照してください。)addAttributeメソッドを使用すると、属性キー名を最初のスポットに、属性値を2番目のスポットに、範囲を3番目のスポットに配置できます。

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)

ここに画像の説明を入力してください

最後に、背景色を追加しましょう。多様性のために、addAttributesメソッドを使用しましょう(に注意してくださいs)。この方法で一度に複数の属性を追加できますが、もう一度追加するだけです。

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

ここに画像の説明を入力してください

一部の場所で属性が重複していることに注意してください。属性を追加しても、すでに存在する属性は上書きされません。

関連した

参考文献


4
あなたは、例えば下線のためのいくつかのスタイルを組み合わせることができますことを注意NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue
beebを

3
NSMutableAttributedStringにある必要があるNSAttributedStringでappendAttributedStringを使用できません。これを反映するように回答を更新できますか?
ジョセフアストラハン

3
1)回答ありがとうございます。2)私はあなたが置くことを示唆しているtextView.atrributedtText = myStringmyLabel.attributedText = myString始まり、あなたの答えの。初心者として、私はちょうどやっていたmyLabel.textと私は通過する必要は思わなかったすべてのあなたの答え。** 3)**あなたはどちらか一方のみ持つことができ、この意味していattributedTextたりtext、それらの両方を持つものとしては無意味でしょうか?4)このlineSpacing例は非常に役立つので、回答にもこの例を組み込むことをお勧めします。5) ачаардахин–
ハニー

1
追加と追加の違いは最初に混乱しました。appendAttributedString「文字列連結」のようなものです。addAttribute文字列に新しい属性を追加しています。
ハニー、

2
@DanielはのaddAttributeメソッドですNSMutableAttributedStringStringまたはで使用できませんNSAttributedString。(この投稿myString「属性付き文字列変更」セクションの定義を確認してください。投稿myStringの最初の部分で変数名にも使用されていたので、それを捨てたと思いますNSAttributedString。)
Suragch

114

SwiftはNSMutableAttributedStringObj-C と同じ方法を使用します。計算値を文字列として渡すことでインスタンス化します。

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

次に属性付きg文字列(heh)を作成します。注: UIFont.systemFontOfSize(_)は失敗する可能性のあるイニシャライザなので、使用する前にアンラップする必要があります。

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

そしてそれを追加します:

attributedString.appendAttributedString(gString)

次に、次のようにNSAttributedStringを表示するようにUILabelを設定できます。

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) UILabel.text = coffeeTextを設定すると、「NSMutableAttributedStringは 'String'に変換できません。UILabelがNSMutableAttributedStringを受け入れるようにする方法はありますか?
dcbenji

11
属性付き文字列がある場合、テキストプロパティではなくラベルのattributedTextプロパティを設定する必要があります。
NRitH 2014

1
これは適切に機能し、小文字の "g"がコーヒーの量のテキストの最後に追加されます
dcbenji 14

2
なんらかの理由で、NSAttributedStringの行で「呼び出し中の余分な引数」というエラーが発生します。これは、UIFont.systemFontOfSize(18)をUIFont(name: "Arial"、size:20)に切り替えたときにのみ発生します。何か案は?
Unome 2014年

UIFont(name:size :)は失敗する初期化子であり、nilを返す場合があります。追加することで明示的にアンラップすることもできます!最後に、または辞書に挿入する前に、if / letステートメントで変数にバインドします。
Ash

21

Xcode 6バージョン

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

Xcode 9.3バージョン

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

スウィフト4:

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

コンパイルされませんType 'NSAttributedStringKey' (aka 'NSString') has no member 'font'
ビブシー2018

私は最新のXCode(10ベータ6)で試してみましたが、コンパイルできます。Swift4を使用していますか?
アダムバードン2018

私はSwift 3を使用しています
ビブシー2018

4
それが問題です。私の答えは「Swift 4」という大胆なタイトルです
。Swift4に

@bibscy NSAttributedString.Key。***を使用できます
Hatim

19

属性付き文字列にはライブラリを使用することを強くお勧めします。これにより、たとえば、1つの文字列に4つの異なる色と4つの異なるフォントを使用することが非常に簡単になります。 これが私のお気に入りです。これはSwiftyAttributesと呼ばれます

SwiftyAttributesを使用して4つの異なる色と異なるフォントで文字列を作成したい場合:

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 として表示されます

画像として表示


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

iOSで属性付き文字列にアプローチする最良の方法は、インターフェイスビルダーで組み込みの属性付きテキストエディターを使用して、ソースファイルで不必要なNSAtrributedStringKeysのハードコーディングを回避することです。

この拡張機能を使用して、後で実行時にプレースホルダーを動的に置き換えることができます。

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

このような属性付きテキストを含むストーリーボードラベルを追加します。

ここに画像の説明を入力してください

その後、次のように必要になるたびに値を更新するだけです。

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

必ず元の値をinitalAttributedStringに保存してください。

この記事を読むと、このアプローチをよりよく理解できます。https//medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e


これは、ストーリーボードがあり、ラベルの文字列の一部に太字を追加したいという私の場合に非常に役立ちました。すべての属性を手動で設定するよりもはるかに簡単です。
マークアティナシ

この拡張機能は以前は完全に機能していましたが、Xcode 11ではアプリがクラッシュしましたlet nsRange = NSRange(range,in:valueString)
Lucas P.

9

Swift 2.0

ここにサンプルがあります:

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

または

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

ベータ6で正常に動作します

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

7

あなたの問題を解決するオンラインツールを作成しました!文字列を記述して、スタイルをグラフィカルに適用できます。ツールを使用すると、その文字列を生成するためのObjective-Cと迅速なコードが得られます。

また、オープンソースなので、自由に拡張してPRを送信してください。

変圧器ツール

Github

ここに画像の説明を入力してください


私のために働いていません。スタイルを適用せずに、すべてを括弧で囲みます。
Daniel Springer

6

Swift 5以降

   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
}

//実装

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

4

スウィフト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)

あなたはSwift 4で生の値を削除する必要があります


3

上記の解決策は、特定の色やプロパティを設定するときに機能しませんでした。

これはうまくいきました:

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と2.1の間でどのような変更が行われましたか?
Suragch

3

このサンプルコードを使用します。これは、要件を達成するための非常に短いコードです。これは私のために働いています。

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.white)cell.IBLabelGuestAppointment .setSubTextColor(pSubString: "Guest2"、pColor:UIColor.red)
Dipak Panchasara

1
SOへようこそ。コードをフォーマットし、説明/コンテキストを回答に追加してください。参照:stackoverflow.com/help/how-to-answer
Uwe Allner

2

属性はSwift 3で直接設定できます...

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

次に、属性を持つ任意のクラスで変数を使用します


2

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

単にrange.countの長さではないのですか?
レオダバス

2

細部

  • Swift 5.2、Xcode 11.4(11E146)

解決

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

使用法

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)

完全な例

ここにソリューションコード貼り付けることを忘れないでください

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

結果

ここに画像の説明を入力してください


1

私が作成したライブラリーで問題を解決するのは本当に簡単です。それはAtributikaと呼ばれます。

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

ここで見つけることができますhttps://github.com/psharanda/Atributika



1

Swifter Swiftには、何の作業もせずにこれを行うためのかなり甘い方法があります。照合するパターンとそれに適用する属性を指定するだけです。彼らは多くのことをチェックするのに最適です。

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

これが適用される場所が複数あり、特定のインスタンスに対してのみ発生させたい場合、このメソッドは機能しません。

これは1つのステップで行うことができ、分離すると読みやすくなります。


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 //属性付き文字列を作成する

次のような属性を定義します

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

0

Prestylerの使用を検討してください

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

0

スウィフト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

ここに画像の説明を入力してください


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

}

//以下のように使用します

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

2
この回答は、迅速に属性付き文字列を作成する方法を除いて、知っておく必要があるすべてを伝えます。
Eric
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.