NSAttributedStringで文字列の色を変更しますか?


147

スライダーの値に基づいて次の文字列を表示する調査用のスライダーがあります:「非常に悪い、悪い、良い、良い、非常に良い」。

スライダーのコードは次のとおりです。

- (IBAction) sliderValueChanged:(UISlider *)sender {
    scanLabel.text = [NSString stringWithFormat:@" %.f", [sender value]];
    NSArray *texts=[NSArray arrayWithObjects:@"Very Bad", @"Bad", @"Okay", @"Good", @"Very Good", @"Very Good", nil];
    NSInteger sliderValue=[sender value]; //make the slider value in given range integer one.
    self.scanLabel.text=[texts objectAtIndex:sliderValue];
}

「とても悪い」を赤、「悪い」をオレンジ、「大丈夫」を黄色、「良い」と「とても良い」を緑にしたい。

これを行うための使用方法がわかりませんNSAttributedString



UISlider?それにはラベルがありません。だから基本的には、フォントの色のUILabelについてですか?または、テキストの一部に色を付けたいですか?
Roger


このライブラリを使用すると、非常に簡単です。 github.com/iOSTechHub/AttributedString
Ashish Chauhan

回答:


196

を使用する必要はありませんNSAttributedString。必要なのは、適切なラベルの付いたシンプルなラベルだけですtextColor。さらに、このシンプルなソリューションは、iOS 6だけでなく、iOSのすべてのバージョンで機能します。

しかし、不必要にを使用したい場合はNSAttributedString、次のようにすることができます。

UIColor *color = [UIColor redColor]; // select needed color
NSString *string = ... // the string to colorize
NSDictionary *attrs = @{ NSForegroundColorAttributeName : color };
NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:string attributes:attrs];
self.scanLabel.attributedText = attrStr;

4
すべての反対票を理解していません。私の答えは、属性付き文字列を使用するよりもはるかに簡単です。OPはNSAttributedStringこのタスクに使用する必要はありません。ラベルのテキストに複数の属性が必要な場合は1つ必要ですが、そうではありません。ラベル全体を一度に1色にする必要があります。
rmaddy 2015年

@RubénE.Marínしかし、それが問題です。OPは、ソリューションがを使用する必要があると誤って考えましたNSAttributedString。それが彼らが求めていたものです。本当の問題は、「値に基づいてラベルの色を設定する方法」でした。解決策は必要ないことを指摘しNSAttributedString、はるかに単純な答えを示しました。そしてOPは、私のはるかに単純な答えを受け入れることで合意しました。OPが本当に望んNSAttributedStringでいたとしたら、彼らは私の答えを受け入れなかっただろう。したがって、反対票を投じる理由はありません。私は真の質問に答え、OPは受け入れました。
rmaddy 2015年

24
その場合、私はNSAttributedStringで質問を解決し、その後、OPの特定のケースに対するより簡単で効率的なソリューションを指摘しました。この質問に来る人々は、NSAttributedStringのテキストの色を変更する方法を探しているため、ソリューションに不満を感じるかもしれません(そして、それはあなたの反対票を説明するでしょう)。
ルーベンマリン

15
Rubénは正解です。属性文字列に色を設定する必要があるため、ここに来ました。複数の色とフォントサイズを持つ複合属性文字列を構築しているからです。そして、私が必要とするNSForegroundColorAttributeName主要な情報は鍵でした。それは、Appleのドキュメントで見つけるのに苦労しました。
Erik van der Neut

5
まだ質問に答えてくれてありがとう!! OPが実際にそれを必要としなかったとしても。何度もググって、最終的にスタックオーバーフローの質問になりました。これはまさに私が探しているものです。質問への賢明な回答は、OPが質問のタイトルが要求するものを実際には必要としないと判断しただけです。まったく別の質問に答えました。さて、検索結果から来る将来の人々は、1 OPに対して1000になる可能性があるため、投稿のタイトルで尋ねられた質問に対する解決策を実際に望んでいる可能性があります。</ rant>
ダニー2015年

112

このようなものを使用してください(コンパイラはチェックされていません)

NSMutableAttributedString *string = [[NSMutableAttributedString alloc]initWithString:self.text.text];
NSRange range=[self.myLabel.text rangeOfString:texts[sliderValue]]; //myLabel is the outlet from where you will get the text, it can be same or different

NSArray *colors=@[[UIColor redColor],
                  [UIColor redColor],
                  [UIColor yellowColor],
                  [UIColor greenColor]
                 ];

[string addAttribute:NSForegroundColorAttributeName 
               value:colors[sliderValue] 
               range:range];           

[self.scanLabel setAttributedText:texts[sliderValue]];

ねえアヌープ、またお会いできてうれしいです!あなたが提供したコードを取り除き、self.text.textをself.scanLabel.textに置き換えましたが、「word」でエラーが発生します。運が悪かったので、@ "Very Bad"に置き換えてみました。
アダム

私はここから私の答えをコピーしstackoverflow.com/questions/14231879/...
アヌープVaidya

Anoopに感謝しますが、私には運がありません。-[__ NSCFString _ui_synthesizeAttributedSubstringFromRange:usingDefaultAttributes:]:認識されないセレクターがインスタンス0x1f845af0 2013-01-11 16:27:34.939 yellaProto [7829:907]に送信されました***キャッチされない例外 'NSInvalidArgumentException'、理由: '-[__ NSCFString _ui_synthesizeAttributedSubstringFromRange:usingDefaultAttributes:]:認識されないセレクターがインスタンス0x1f845af0 'に送信されました
Adam

「テキスト」のotuを理解するために試してみてください
Morkrom

@Morkrom:この回答に2番目のコメントが表示された場合、次のことを知ることができます:p
Anoop Vaidya 2013

48

ではスウィフト4

// Custom color
let greenColor = UIColor(red: 10/255, green: 190/255, blue: 50/255, alpha: 1)
// create the attributed colour
let attributedStringColor = [NSAttributedStringKey.foregroundColor : greenColor];
// create the attributed string
let attributedString = NSAttributedString(string: "Hello World!", attributes: attributedStringColor)
// Set the label
label.attributedText = attributedString

スウィフト3

// Custom color
let greenColor = UIColor(red: 10/255, green: 190/255, blue: 50/255, alpha: 1)
// create the attributed color
let attributedStringColor : NSDictionary = [NSForegroundColorAttributeName : greenColor];
// create the attributed string
let attributedString = NSAttributedString(string: "Hello World!", attributes: attributedStringColor as? [String : AnyObject])
// Set the label
label.attributedText = attributedString 

楽しい。


28

スウィフト5:

var attributes = [NSAttributedString.Key: AnyObject]()
attributes[.foregroundColor] = UIColor.red

let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)

label.attributedText = attributedString

スウィフト4:

var attributes = [NSAttributedStringKey: AnyObject]()
attributes[.foregroundColor] = UIColor.red

let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)

label.attributedText = attributedString

スウィフト3:

var attributes = [String: AnyObject]()
attributes[NSForegroundColorAttributeName] = UIColor.red

let attributedString = NSAttributedString(string: "Very Bad", attributes: attributes)

label.attributedText = attributedString

7

作成できます NSAttributedString

NSDictionary *attributes = @{ NSForegroundColorAttributeName : [UIColor redColor] };
NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:@"My Color String" attributes:attrs];

またはNSMutableAttributedString、範囲でカスタム属性を適用します。

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@%@", methodPrefix, method] attributes: @{ NSFontAttributeName : FONT_MYRIADPRO(48) }];
[attributedString addAttribute:NSFontAttributeName value:FONT_MYRIADPRO_SEMIBOLD(48) range:NSMakeRange(methodPrefix.length, method.length)];

利用可能な属性:NSAttributedStringKey


更新:

Swift 5.1

let message: String = greeting + someMessage
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 2.0
    
// Note: UIFont(appFontFamily:ofSize:) is extended init.
let regularAttributes: [NSAttributedString.Key : Any] = [.font : UIFont(appFontFamily: .regular, ofSize: 15)!, .paragraphStyle : paragraphStyle]
let boldAttributes = [NSAttributedString.Key.font : UIFont(appFontFamily: .semiBold, ofSize: 15)!]

let mutableString = NSMutableAttributedString(string: message, attributes: regularAttributes)
mutableString.addAttributes(boldAttributes, range: NSMakeRange(0, greeting.count))

5

Swift 4では、NSAttributedStringKeyという静的プロパティがありますforegroundColorforegroundColor次の宣言があります:

static let foregroundColor: NSAttributedStringKey

この属性の値はUIColorオブジェクトです。この属性を使用して、レンダリング中のテキストの色を指定します。この属性を指定しない場合、テキストは黒でレンダリングされます。

次のPlaygroundコードは、NSAttributedStringインスタンスのテキストの色を設定する方法を示していますforegroundColor

import UIKit

let string = "Some text"
let attributes = [NSAttributedStringKey.foregroundColor : UIColor.red]
let attributedString = NSAttributedString(string: string, attributes: attributes)

番組以下のコード可能UIViewController依存する実装NSAttributedStringのテキストとテキストの色を更新するためにUILabelからUISlider

import UIKit

enum Status: Int {
    case veryBad = 0, bad, okay, good, veryGood

    var display: (text: String, color: UIColor) {
        switch self {
        case .veryBad:  return ("Very bad", .red)
        case .bad:      return ("Bad", .orange)
        case .okay:     return ("Okay", .yellow)
        case .good:     return ("Good", .green)
        case .veryGood: return ("Very good", .blue)
        }
    }

    static let minimumValue = Status.veryBad.rawValue
    static let maximumValue = Status.veryGood.rawValue
}
final class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var slider: UISlider!
    var currentStatus: Status = Status.veryBad {
        didSet {
            // currentStatus is our model. Observe its changes to update our display
            updateDisplay()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Prepare slider
        slider.minimumValue = Float(Status.minimumValue)
        slider.maximumValue = Float(Status.maximumValue)

        // Set display
        updateDisplay()
    }

    func updateDisplay() {
        let attributes = [NSAttributedStringKey.foregroundColor : currentStatus.display.color]
        let attributedString = NSAttributedString(string: currentStatus.display.text, attributes: attributes)
        label.attributedText = attributedString
        slider.value = Float(currentStatus.rawValue)
    }

    @IBAction func updateCurrentStatus(_ sender: UISlider) {
        let value = Int(sender.value.rounded())
        guard let status = Status(rawValue: value) else { fatalError("Could not get Status object from value") }
        currentStatus = status
    }

}

注しかし、あなたが本当に使用する必要がないことNSAttributedString、例えば、単純に頼ることができるUILabeltexttextColor性質。したがって、updateDisplay()実装を次のコードに置き換えることができます。

func updateDisplay() {
    label.text = currentStatus.display.text
    label.textColor = currentStatus.display.color
    slider.value = Float(currentStatus.rawValue)
}

2

Swift 4.2のアップデート

var attributes = [NSAttributedString.Key: AnyObject]()

attributes[.foregroundColor] = UIColor.blue

let attributedString = NSAttributedString(string: "Very Bad",
attributes: attributes)

label.attributedText = attributedString

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