SwiftでNSMutableAttributedStringを使用して特定のテキストの色を変更する


100

私が抱えている問題は、TextViewの特定のテキストのtextColorを変更できるようにしたいということです。私は連結された文字列を使用していて、TextViewのテキストに追加する文字列が欲しいだけです。私が使いたいのはのようですがNSMutableAttributedString、Swiftでこれを使用する方法についてのリソースは見つかりません。私がこれまで持っているのは次のようなものです:

let string = "A \(stringOne) with \(stringTwo)"
var attributedString = NSMutableAttributedString(string: string)
textView.attributedText = attributedString

ここから、textColorを変更する必要がある単語の範囲を見つけて、属性付き文字列に追加する必要があることがわかります。私が知る必要があるのは、attributedStringから正しい文字列を見つけて、そのtextColorを変更する方法です。

評価が低すぎるので自分の質問には答えられませんが、ここに私が見つけた答えがあります

からいくつかのコードを翻訳して翻訳することで自分の答えを見つけました

NSAttributedStringの部分文字列の属性を変更する

Swiftでの実装例を次に示します。

let string = "A \(stringOne) and \(stringTwo)"
var attributedString = NSMutableAttributedString(string:string)

let stringOneRegex = NSRegularExpression(pattern: nameString, options: nil, error: nil)
let stringOneMatches = stringOneRegex.matchesInString(longString, options: nil, range: NSMakeRange(0, attributedString.length))
for stringOneMatch in stringOneMatches {
    let wordRange = stringOneMatch.rangeAtIndex(0)
    attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.nameColor(), range: wordRange)
}

textView.attributedText = attributedString

複数の文字列のtextColorを変更したいので、これを処理するヘルパー関数を作成しますが、これはtextColorを変更するために機能します。


Objective-Cでそれを行う方法を知っていますか?Swiftで同じコードを書き直そうとしましたか?
アーロンブラジャー2014

これは本当に良い答えです:stackoverflow.com/a/37992022/426571
el_quick

回答:


110

あなたは質問にいくらか答えましたが、タイトルの質問に答えるために正規表現を使用せずに、もう少し簡潔な方法を提供するために:

テキストの長さの色を変更するには、文字列内の色付けされる文字の開始インデックスと終了インデックスを知る必要があります。

var main_string = "Hello World"
var string_to_color = "World"

var range = (main_string as NSString).rangeOfString(string_to_color)

次に、属性付き文字列に変換し、NSForegroundColorAttributeNameで「属性を追加」を使用します。

var attributedString = NSMutableAttributedString(string:main_string)
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor() , range: range)

設定できるその他の標準属性のリストは、Appleのドキュメントに記載されています。


20
NSColorはOSXのみです-IOSにはUIColorを使用してください
スティーブ・オコナー

1
var main_string = "Hello World Hello World Hello World"があり、文字列全体の "World"に色を適用する必要がある場合はどうなりますか?
msmq 2016年

main_stringstring_to_colorおよび変更rangeされたことはありません。それらをlet一定に変更することを検討しますか?
チェザーレ

素晴らしい解決策。あなたは私の日を救った。
Sagar Chauhan

106

SWIFT 5

let main_string = "Hello World"
let string_to_color = "World"

let range = (main_string as NSString).range(of: string_to_color)

let attribute = NSMutableAttributedString.init(string: main_string)
attribute.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red , range: range)


txtfield1 = UITextField.init(frame:CGRect(x:10 , y:20 ,width:100 , height:100))
txtfield1.attributedText = attribute

SWIFT 4.2

 let txtfield1 :UITextField!

    let main_string = "Hello World"
    let string_to_color = "World"

    let range = (main_string as NSString).range(of: string_to_color)

    let attribute = NSMutableAttributedString.init(string: main_string)
    attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red , range: range)


    txtfield1 = UITextField.init(frame:CGRect(x:10 , y:20 ,width:100 , height:100))
    txtfield1.attributedText = attribute

文字列が大きく、多くの重複(類似)単語がある場合はどうなりますか。range(of:...)は機能しますか?
ハティム

44

Swift 2.1アップデート:

 let text = "We tried to make this app as most intuitive as possible for you. If you have any questions don't hesitate to ask us. For a detailed manual just click here."
 let linkTextWithColor = "click here"

 let range = (text as NSString).rangeOfString(linkTextWithColor)

 let attributedString = NSMutableAttributedString(string:text)
 attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor() , range: range)

 self.helpText.attributedText = attributedString

self.helpTextあるUILabel出口は。


1
ああクリス、あなたは私のヒーローです。私はこの正確なコードブロックを長い間探しています。
PanMluvčí16年

@chris。textviewでnsmutableattributed文字列を変更したいのですが、それは可能ですか
Uma Madhavi

それは単一の単語に対して機能しますが、私の文字列には色の変化である複数の単語がありますが、その赤い色の単語の後にその単語の色も赤いので書き込みます。
Dhaval Solanki 2018

ご協力ありがとうございました!
ssowri1

18

Swift 4.2およびSwift 5は、文字列の一部をカラー化します。

文字列を拡張しながらNSMutableAttributedStringを使用する非常に簡単な方法。これは、文字列全体で複数の単語を色付けするためにも使用できます。

拡張子の新しいファイルを追加します。ファイル->新規->元の名前のSwiftファイル。「NSAttributedString + TextColouring」とコードを追加

import UIKit

extension String {
    func attributedStringWithColor(_ strings: [String], color: UIColor, characterSpacing: UInt? = nil) -> NSAttributedString {
        let attributedString = NSMutableAttributedString(string: self)
        for string in strings {
            let range = (self as NSString).range(of: string)
            attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range)
        }

        guard let characterSpacing = characterSpacing else {return attributedString}

        attributedString.addAttribute(NSAttributedString.Key.kern, value: characterSpacing, range: NSRange(location: 0, length: attributedString.length))

        return attributedString
    }
}

これで、必要なビューコントローラーでグローバルに使用できます。

let attributedWithTextColor: NSAttributedString = "Doc, welcome back :)".attributedStringWithColor(["Doc", "back"], color: UIColor.black)

myLabel.attributedText = attributedWithTextColor

Swift 4でテキストのカラーリングを使用する例


11

回答は以前の投稿ですでに与えられていますが、これを行う別の方法があります

Swift 3x:

var myMutableString = NSMutableAttributedString()

myMutableString = NSMutableAttributedString(string: "Your full label textString")

myMutableString.setAttributes([NSFontAttributeName : UIFont(name: "HelveticaNeue-Light", size: CGFloat(17.0))!
        , NSForegroundColorAttributeName : UIColor(red: 232 / 255.0, green: 117 / 255.0, blue: 40 / 255.0, alpha: 1.0)], range: NSRange(location:12,length:8)) // What ever range you want to give

yourLabel.attributedText = myMutableString

これが誰にも役立つことを願っています!


@UmaMadhavi正確にあなたの要件は何ですか?
Anurag Sharma

textviewのフォントサイズとフォントの色を変更したい。nsmutableattributedstringで取得しています。
Uma Madhavi 2017年

このチェックアウト@UmaMadhavi リンク1リンク2を。参考になるかもしれません!
Anurag Sharma

フォントが利用できない場合にクラッシュします。
SafeFastExpressive

10

クリスの答えは私にとって非常に役に立ちました。そこで私は彼のアプローチを使用して、再利用できる関数に変えました。これにより、部分文字列に色を割り当て、残りの文字列に別の色を割り当てます。

static func createAttributedString(fullString: String, fullStringColor: UIColor, subString: String, subStringColor: UIColor) -> NSMutableAttributedString
{
    let range = (fullString as NSString).rangeOfString(subString)
    let attributedString = NSMutableAttributedString(string:fullString)
    attributedString.addAttribute(NSForegroundColorAttributeName, value: fullStringColor, range: NSRange(location: 0, length: fullString.characters.count))
    attributedString.addAttribute(NSForegroundColorAttributeName, value: subStringColor, range: range)
    return attributedString
}

6

Swift 4.1

NSAttributedStringKey.foregroundColor

たとえば、NavBarでフォントを変更する場合は、次のようにします。

self.navigationController?.navigationBar.titleTextAttributes = [ NSAttributedStringKey.font: UIFont.systemFont(ofSize: 22), NSAttributedStringKey.foregroundColor: UIColor.white]

6

あなたは私がそれをテストするこの拡張機能を使うことができます

迅速な4.2

import Foundation
import UIKit

extension NSMutableAttributedString {

    convenience init (fullString: String, fullStringColor: UIColor, subString: String, subStringColor: UIColor) {
           let rangeOfSubString = (fullString as NSString).range(of: subString)
           let rangeOfFullString = NSRange(location: 0, length: fullString.count)//fullString.range(of: fullString)
           let attributedString = NSMutableAttributedString(string:fullString)
           attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: fullStringColor, range: rangeOfFullString)
           attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: subStringColor, range: rangeOfSubString)

           self.init(attributedString: attributedString)
   }

}

4

Swift 2.2

var myMutableString = NSMutableAttributedString()

myMutableString = NSMutableAttributedString(string: "1234567890", attributes: [NSFontAttributeName:UIFont(name: kDefaultFontName, size: 14.0)!])

myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor(red: 0.0/255.0, green: 125.0/255.0, blue: 179.0/255.0, alpha: 1.0), range: NSRange(location:0,length:5))

self.lblPhone.attributedText = myMutableString

これを行うとエラーが発生します。これなしで欲しいと思います.CGColor
ビョルンロシュ

@SarabjitSingh これはテキストビューでどのように可能ですか
Uma Madhavi

@UmaMadhavi ...必要なのは、self.textView.attributedText = myMutableStringを追加するだけです.....機能します...
Sarabjit Singh

4

色、フォントなどの異なるスタイルでラベルを付ける最も簡単な方法は、属性インスペクターでプロパティ「属性」を使用することです。テキストの一部を選択して、好きなように変更するだけです

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


1
プログラムで文字列を変更していないと考えて
Alejandro Cumpa '20 / 07/20

4

文字列拡張を作成する前の回答に基づく

extension String {

func highlightWordsIn(highlightedWords: String, attributes: [[NSAttributedStringKey: Any]]) -> NSMutableAttributedString {
     let range = (self as NSString).range(of: highlightedWords)
     let result = NSMutableAttributedString(string: self)

     for attribute in attributes {
         result.addAttributes(attribute, range: range)
     }

     return result
    }
}

テキストの属性をメソッドに渡すことができます

このように電話する

  let attributes = [[NSAttributedStringKey.foregroundColor:UIColor.red], [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 17)]]
  myLabel.attributedText = "This is a text".highlightWordsIn(highlightedWords: "is a text", attributes: attributes)

4

Swift 4.1

これから変更しましたIn Swift 3

let str = "Welcome "
let welcomeAttribute = [ NSForegroundColorAttributeName: UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)

そしてこれはSwift 4.0で

let str = "Welcome "
let welcomeAttribute = [ NSAttributedStringKey.foregroundColor: UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)

スウィフト4.1

let str = "Welcome "
let welcomeAttribute = [ NSAttributedStringKey(rawValue: NSForegroundColorAttributeName): UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)

正常に動作します


これは文字列全体を変更していますか?これは私にとって最も読みやすいですが、OPが尋ねたように文字列内の特定の単語のみを変更する方法はありますか。
Moondra

3

迅速な4.2

    let textString = "Hello world"
    let range = (textString as NSString).range(of: "world")
    let attributedString = NSMutableAttributedString(string: textString)

    attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: range)
    self.textUIlable.attributedText = attributedString

2

テキスト内の複数の単語に特定の色を適用する」を探しているすべての人のために、NSRegularExpressionを使用してそれを行うことができます

 func highlight(matchingText: String, in text: String) {
    let attributedString  = NSMutableAttributedString(string: text)
    if let regularExpression = try? NSRegularExpression(pattern: "\(matchingText)", options: .caseInsensitive) {
        let matchedResults = regularExpression.matches(in: text, options: [], range: NSRange(location: 0, length: attributedString.length))
        for matched in matchedResults {
             attributedString.addAttributes([NSAttributedStringKey.backgroundColor : UIColor.yellow], range: matched.range)

        }
        yourLabel.attributedText = attributedString
    }
}

参照リンク:https : //gist.github.com/aquajach/4d9398b95a748fd37e88


MacOS cocoaアプリでコードを使用することは可能ですか?ココアプロジェクトで使用しようとしましたが、ココアNSTextViewに.attributedTextがありません。
CaOs433

2

これはあなたのための仕事かもしれません

let main_string = " User not found,Want to review ? Click here"
    let string_to_color = "Click here"

    let range = (main_string as NSString).range(of: string_to_color)

    let attribute = NSMutableAttributedString.init(string: main_string)
    attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.blue , range: range)

    lblClickHere.attributedText = attribute

1
このコードスニペットが解決策になる可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
HMD、

2

このシンプルな機能を使用して、テキストを割り当て、選択した単語を強調表示できます。

UITextViewUILabelなどに変更することもできます。

func highlightBoldWordAtLabel(textViewTotransform: UITextView, completeText: String, wordToBold: String){
    textViewToTransform.text = completeText
    let range = (completeText as NSString).range(of: wordToBold)
    let attribute = NSMutableAttributedString.init(string: completeText)

    attribute.addAttribute(NSAttributedString.Key.font, value: UIFont.boldSystemFont(ofSize: 16), range: range)
    attribute.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.black , range: range)
    textViewToTransform.attributedText = attribute
}

1

フォントの色を変更するには、最初に下の画像のようにプレーンではなく属性を選択します

次に、属性フィールドのテキストを選択し、線形の右側にあるカラーボタンを選択する必要があります。色が変わります。


1

この方法を使用できます。このメソッドを共通のユーティリティクラスに実装して、グローバルにアクセスしました。

func attributedString(with highlightString: String, normalString: String, highlightColor: UIColor) -> NSMutableAttributedString {
    let attributes = [NSAttributedString.Key.foregroundColor: highlightColor]
    let attributedString = NSMutableAttributedString(string: highlightString, attributes: attributes)
    attributedString.append(NSAttributedString(string: normalString))
    return attributedString
}

0

Swift 3xとUITextViewを使用している場合、NSForegroundColorAttributeNameが機能しない可能性があります(どの方法を試しても機能しません)。

だから、いくつか掘り下げた後、私は解決策を見つけました。

//Get the textView somehow
let textView = UITextView()
//Set the attributed string with links to it
textView.attributedString = attributedString
//Set the tint color. It will apply to the link only
textView.tintColor = UIColor.red

0

これを行うための超簡単な方法。

let text = "This is a colorful attributed string"
let attributedText = 
NSMutableAttributedString.getAttributedString(fromString: text)
attributedText.apply(color: .red, subString: "This")
//Apply yellow color on range
attributedText.apply(color: .yellow, onRange: NSMakeRange(5, 4))

詳細については、こちらをクリックしてください:https : //github.com/iOSTechHub/AttributedString


0

属性付き文字列のパラメータではなく、textviewパラメータを変更する必要があります

textView.linkTextAttributes = [
        NSAttributedString.Key.foregroundColor: UIColor.red,
        NSAttributedString.Key.underlineColor: UIColor.red,
        NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue
    ]


0
extension String{
// to make text field mandatory * looks
mutating func markAsMandatoryField()-> NSAttributedString{

    let main_string = self
    let string_to_color = "*"
    let range = (main_string as NSString).range(of: string_to_color)
    print("The rang = \(range)")
    let attribute = NSMutableAttributedString.init(string: main_string)
    attribute.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.rgbColor(red: 255.0, green: 0.0, blue: 23.0) , range: range)
     return attribute
}

}

EmailLbl.attributedText = EmailLbl.text!.markAsMandatoryField()を使用します


0

シンプルな拡張として使用できます

extension String{

func attributedString(subStr: String) -> NSMutableAttributedString{
    let range = (self as NSString).range(of: subStr)
    let attributedString = NSMutableAttributedString(string:self)
    attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red , range: range)
    
    return attributedString
  }
}

myLable.attributedText = fullStr.attributedString(subStr: strToChange)

  
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.