NSAttributedString으로 문자열 색상을 변경 하시겠습니까?


147

슬라이더 값에 따라 "Very Bad, Bad, Okay, Good, Very Good"이라는 문자열을 표시하는 설문 조 사용 슬라이더가 있습니다.

슬라이더 코드는 다음과 같습니다.

- (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];
}

"Very Bad"를 빨간색으로, "Bad"를 주황색으로, "Okay"를 노란색으로, "Good"및 "Very Good"을 녹색으로 바꿉니다.

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이 작업 에 사용할 필요가 없습니다 . 레이블의 텍스트에 여러 속성이 필요하지만 그렇지 않은 경우 한 가지입니다. 전체 라벨은 한 번에 하나의 색상이어야합니다.
rmaddy

@ RubénE.Marín 그러나 그것은 문제입니다. OP는 실수로 솔루션을 사용해야한다고 생각했습니다 NSAttributedString. 그것이 그들이 요청한 것입니다. 실제 질문은 "값에 따라 레이블의 색상을 설정하는 방법" 이었습니다. 나는 해결책이 필요하지 않으며 NSAttributedString훨씬 더 간단한 대답을 보여 주었다고 지적했다 . 그리고 OP는 훨씬 간단한 대답을 받아들이기로 동의했습니다. OP가 정말로 원한다면 NSAttributedString내 대답을 수락하지 않았을 것입니다. 따라서 다운 투표에 대한 이유는 없습니다. 나는 진정한 질문에 대답했고 OP는 받아 들였다.
rmaddy

24
이 경우 NSAttributedString을 사용하여 문제를 해결 한 후 OP의 특정 사례에 대한 더 간단하고 효율적인 솔루션을 지적했을 것입니다. 이 질문에 오는 사람들은 NSAttributedString에서 텍스트 색상을 변경하는 방법을 찾고 있기 때문에 솔루션에 좌절감을 느낄 수 있습니다.
Ruben Marin

15
Rubén이 맞습니다. 여러 가지 색상과 글꼴 크기의 복합 속성 문자열을 작성하기 때문에 속성 문자열에서 색상을 설정해야하기 때문에 여기에 왔습니다. 그리고 내가 필요한 주요 정보 NSForegroundColorAttributeName는 애플 문서에서 찾기 힘들었던 키 였습니다 .
Erik van der Neut

5
여전히 질문에 답변 해 주셔서 감사합니다 !! OP가 실제로 필요하지 않은 경우에도 마찬가지입니다. 그래서 여러 번 Google에서 무언가를 찾고, 정확하게 찾고있는 스택 오버플로 질문으로 끝났습니다. 질문에 답하는 현명한 엉덩이가 OP가 실제로 질문 제목에 요구하는 것을 필요로하지 않는다고 결정한 것을 발견했습니다. 완전히 다른 질문에 대답했습니다. 글쎄, 장래에 검색 결과에서 오는 사람들은 1 OP와 반대되는 1000이있을 수 있지만 실제로 게시물 제목에 묻는 질문에 대한 해결책을 원할 수 있습니다. </ rant>
danny

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]];

안녕, Anoop, 다시 만나서 반갑습니다! 제공 한 코드를 처리하고 self.text.text를 self.scanLabel.text로 바꾸었지만 "word"에서 오류가 발생합니다. 운이없이 @ "Very Bad"로 바꾸려고했습니다.
Adam

여기에서 답변을 복사했습니다. stackoverflow.com/questions/14231879/…
Anoop Vaidya

고맙습니다 Anoop,하지만 운이 없습니다. -[__ NSCFString _ui_synthesizeAttributedSubstringFromRange : usingDefaultAttributes :] : 0x1f845af0 2013-01-11 16 : 27 : 34.939 yellaProto [7829 : 907] 인스턴스로 전송 된 인식 할 수없는 선택기 _ui_synthesizeAttributedSubstringFromRange : usingDefaultAttributes :] : 인식 할 수없는 선택자가 인스턴스 0x1f845af0에 전송 됨
Adam

그냥 무엇을 "텍스트"OTU 그림을 셈
Morkrom

@Morkrom :이 답변에 2 번째 코멘트가 표시되면 다음을 알게 될 것입니다 : p
Anoop Vaidya

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


최신 정보:

스위프트 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에는이라는 정적 속성이 foregroundColor있습니다. foregroundColor다음과 같은 선언이 있습니다.

static let foregroundColor: NSAttributedStringKey

이 속성의 값은 UIColor객체입니다. 렌더링하는 동안 텍스트의 색상을 지정하려면이 속성을 사용하십시오. 이 속성을 지정하지 않으면 텍스트가 검은 색으로 렌더링됩니다.

다음 놀이터 코드는 다음을 사용하여 NSAttributedString인스턴스 의 텍스트 색상을 설정하는 방법을 보여줍니다 foregroundColor.

import UIKit

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

쇼 아래 코드의 가능성 UIViewController에 의존 구현 NSAttributedStringa의 텍스트와 텍스트 색상을 업데이트하기 위해 UILabelA로부터 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.