두 가지 색상의 텍스트가있는 UILabel


109

다음과 같은 문자열을 표시하고 싶습니다. UILabel .

5 개의 결과가 있습니다.

숫자 5는 빨간색이고 나머지 문자열은 검은 색입니다.

코드에서 어떻게 할 수 있습니까?


6
@EmptyStack iOS 4가 NSAttributedString을 지원하기 때문에 이것은 확실히 그렇지 않습니다 . 아래 내 대답을 참조하십시오.
Mic Pringle 2011-06-28

답변:


223

이를 수행하는 방법은 다음 NSAttributedString과 같이 사용하는 것입니다.

NSMutableAttributedString *text = 
 [[NSMutableAttributedString alloc] 
   initWithAttributedString: label.attributedText];

[text addAttribute:NSForegroundColorAttributeName 
             value:[UIColor redColor] 
             range:NSMakeRange(10, 1)];
[label setAttributedText: text];

나는 UILabel 그것을하기 위해 확장을 만들었다 .


대상을 추가 할 수 있습니까? Thnaks
UserDev 2015 년

내 프로젝트에 확장 프로그램을 추가했습니다! 고마워!
Zeb 2015 년

UILabel에 대한 좋은 카테고리. 감사합니다. 이것은 받아 들여진 대답이어야합니다.
Pradeep Reddy Kypa 2015 년

63

나는 categoryfor 를 만들어서 이것을 했다.NSMutableAttributedString

-(void)setColorForText:(NSString*) textToFind withColor:(UIColor*) color
{
    NSRange range = [self.mutableString rangeOfString:textToFind options:NSCaseInsensitiveSearch];

    if (range.location != NSNotFound) {
        [self addAttribute:NSForegroundColorAttributeName value:color range:range];
    }
}

그것을 사용하십시오

- (void) setColoredLabel
{
    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"Here is a red blue and green text"];
    [string setColorForText:@"red" withColor:[UIColor redColor]];
    [string setColorForText:@"blue" withColor:[UIColor blueColor]];
    [string setColorForText:@"green" withColor:[UIColor greenColor]];
    mylabel.attributedText = string;
}

SWIFT 3

extension NSMutableAttributedString{
    func setColorForText(_ textToFind: String, with color: UIColor) {
        let range = self.mutableString.range(of: textToFind, options: .caseInsensitive)
        if range.location != NSNotFound {
            addAttribute(NSForegroundColorAttributeName, value: color, range: range)
        }
    }
}

용법

func setColoredLabel() {
    let string = NSMutableAttributedString(string: "Here is a red blue and green text")
    string.setColorForText("red", with: #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1))
    string.setColorForText("blue", with: #colorLiteral(red: 0.2392156869, green: 0.6745098233, blue: 0.9686274529, alpha: 1))
    string.setColorForText("green", with: #colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1))
    mylabel.attributedText = string
}

SWIFT 4 @ kj13 알려 주셔서 감사합니다

// If no text is send, then the style will be applied to full text
func setColorForText(_ textToFind: String?, with color: UIColor) {

    let range:NSRange?
    if let text = textToFind{
        range = self.mutableString.range(of: text, options: .caseInsensitive)
    }else{
        range = NSMakeRange(0, self.length)
    }
    if range!.location != NSNotFound {
        addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range!)
    }
}

속성으로 더 많은 실험을 수행했으며 결과는 다음과 같습니다. SOURCECODE

결과는 다음과 같습니다.

스타일


2
메소드를 사용하여 NSMutableAttributedString에 대한 새 카테고리를 생성해야합니다 ... 어쨌든이 샘플을 github에 추가했습니다. github.com/anoop4real/NSMutableAttributedString-Color
anoop4real

하지만 난 전체 문자열의 붉은 색에서 모든 "E"와 같은 .... 문자열 incasesensitive 모든 알파벳의 색상을 설정해야합니다
라비 Ojha

'NSMutableAttributedString'에 대해 보이지 않는 @interface가 'setColorForText : withColor :'선택자를 선언합니다.
ekashking

1
'해결되지 않은 식별자'NSForegroundColorAttributeName '을 Swift4.1로 사용하는 오류가 발생했지만'NSForegroundColorAttributeName '을'NSAttributedStringKey.foregroundColor '로 바꾸고 올바르게 빌드합니다.
kj13

1
@ kj13 알려 주셔서 감사합니다. 답변을 업데이트하고 몇 가지 스타일을 추가했습니다
anoop4real

25

여기 있습니다

NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:lblTemp.text];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];
lblTemp.attributedText = string;

20

스위프트 4

// An attributed string extension to achieve colors on text.
extension NSMutableAttributedString {

    func setColor(color: UIColor, forText stringValue: String) {
       let range: NSRange = self.mutableString.range(of: stringValue, options: .caseInsensitive)
       self.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)
    }

}

// Try it with label
let label = UILabel()
label.frame = CGRect(x: 70, y: 100, width: 260, height: 30)
let stringValue = "There are 5 results."
let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringValue)
attributedString.setColor(color: UIColor.red, forText: "5")
label.font = UIFont.systemFont(ofSize: 26)
label.attributedText = attributedString
self.view.addSubview(label)

결과

여기에 이미지 설명 입력


스위프트 3

func setColoredLabel() {
        var string: NSMutableAttributedString = NSMutableAttributedString(string: "redgreenblue")
        string.setColor(color: UIColor.redColor(), forText: "red")
        string.setColor(color: UIColor.greenColor(), forText: "green")
        string.setColor(color: UIColor.blueColor(, forText: "blue")
        mylabel.attributedText = string
    }


func setColor(color: UIColor, forText stringValue: String) {
        var range: NSRange = self.mutableString.rangeOfString(stringValue, options: NSCaseInsensitiveSearch)
        if range != nil {
            self.addAttribute(NSForegroundColorAttributeName, value: color, range: range)
        }
    }

결과:

여기에 이미지 설명 입력


12
//NSString *myString = @"I have to replace text 'Dr Andrew Murphy, John Smith' ";
NSString *myString = @"Not a member?signin";

//Create mutable string from original one
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:myString];

//Fing range of the string you want to change colour
//If you need to change colour in more that one place just repeat it
NSRange range = [myString rangeOfString:@"signin"];
[attString addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithRed:(63/255.0) green:(163/255.0) blue:(158/255.0) alpha:1.0] range:range];

//Add it to the label - notice its not text property but it's attributeText
_label.attributedText = attString;

6

iOS 6 이후 확장자 나 교체가 필요하지 않도록 UIKit 지지체는 의한 문자열 도면.

에서 UILabel:

@property(nonatomic, copy) NSAttributedString *attributedText;

당신은 그냥 당신 구축해야합니다 NSAttributedString. 기본적으로 두 가지 방법이 있습니다.

  1. 동일한 속성을 가진 텍스트 청크 추가-각 부분에 대해 하나의 NSAttributedString인스턴스를 만들고 하나에 추가합니다.NSMutableAttributedString

  2. 일반 문자열에서 속성을 부여한 텍스트를 만든 다음 지정된 범위에 속성을 추가합니다. 숫자 범위 (또는 기타)를 찾아 다른 색상 속성을 적용합니다.


6

Anups는 신속하게 답변합니다. 모든 클래스에서 재사용 할 수 있습니다.

신속한 파일

extension NSMutableAttributedString {

    func setColorForStr(textToFind: String, color: UIColor) {

        let range = self.mutableString.rangeOfString(textToFind, options:NSStringCompareOptions.CaseInsensitiveSearch);
        if range.location != NSNotFound {
            self.addAttribute(NSForegroundColorAttributeName, value: color, range: range);
        }

    }
}

일부 뷰 컨트롤러에서

let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: self.labelShopInYourNetwork.text!);
attributedString.setColorForStr("YOUR NETWORK", color: UIColor(red: 0.039, green: 0.020, blue: 0.490, alpha: 1.0));
self.labelShopInYourNetwork.attributedText = attributedString;

4

UIWebView 또는 둘 이상의 UILabel을 갖는 것은이 상황에서 과잉으로 간주 될 수 있습니다.

내 제안 은 NSAttributedString 을 지원하는 UILabel의 드롭 인 대체물TTTAttributedLabel 을 사용 하는 것입니다 . 즉, 문자열의 다른 범위에 differents 스타일을 매우 쉽게 적용 할 수 있습니다.




3

JTAttributedLabel (by mystcolor)을 사용하면 iOS 6의 UILabel에서 속성 문자열 지원을 사용할 수 있으며 동시에 JTAutoLabel을 통해 iOS 5의 JTAttributedLabel 클래스를 사용할 수 있습니다.


2

Swift 3.0 솔루션이 있습니다.

extension UILabel{


    func setSubTextColor(pSubString : String, pColor : UIColor){
        let attributedString: NSMutableAttributedString = 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

    }
}

그리고 호출의 예가 있습니다.

let colorString = " (string in red)"
self.mLabel.text = "classic color" + colorString
self.mLabel.setSubTextColor(pSubString: colorString, pColor: UIColor.red)

안녕하세요, 두 개의 다른 colorString을 추가하려면 어떻게해야합니까? 나는 당신의 예제를 사용하고 또 다른 하나를 추가,하지만 여전히 색상 중 하나 .. 시도
에릭 Auranaune

시도해보십시오 : let colorString = "(빨간색 문자열)"let colorStringGreen = "(녹색 문자열)"self.mLabel.text = "클래식 색상"+ colorString + colorStringGreen self.mLabel.setSubTextColor (pSubString : colorString, pColor : UIColor .red) self.mLabel.setSubTextColor (pSubString : colorStringGreen, pColor : UIColor.green)
Kevin ABRIOUX

이것은 이상하지만 여전히 둘 다 변경하지 않습니다 : s24.postimg.org/ds0rpyyut/… .
Erik Auranaune

문제는 두 문자열이 같으면 그 중 하나만 색상이 지정된다는 것 입니다. 여기를보십시오 : pastebin.com/FJZJTpp3 . 이것에 대한 해결책이 있습니까?
Erik Auranaune

2

Swift 4 이상 : anoop4real의 솔루션 에서 영감을 얻은 여기에 2 가지 색상으로 텍스트를 생성하는 데 사용할 수있는 문자열 확장이 있습니다.

extension String {

    func attributedStringForPartiallyColoredText(_ textToFind: String, with color: UIColor) -> NSMutableAttributedString {
        let mutableAttributedstring = NSMutableAttributedString(string: self)
        let range = mutableAttributedstring.mutableString.range(of: textToFind, options: .caseInsensitive)
        if range.location != NSNotFound {
            mutableAttributedstring.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)
        }
        return mutableAttributedstring
    }
}

다음 예제는 나머지 텍스트에 대해 원래 레이블 색상을 유지하면서 별표 색상을 빨간색으로 변경합니다.

label.attributedText = "Enter username *".attributedStringForPartiallyColoredText("*", with: #colorLiteral(red: 1, green: 0, blue: 0, alpha: 1))

2

내 대답에는 텍스트가 한 번만 나타나는 것뿐만 아니라 모든 항목에 색상을 지정하는 옵션도 있습니다. "wa ba wa ba dubdub", 수락 된 답변과 같이 처음 발생하는 것뿐만 아니라 wa의 모든 발생을 색칠 할 수 있습니다.

extension NSMutableAttributedString{
    func setColorForText(_ textToFind: String, with color: UIColor) {
        let range = self.mutableString.range(of: textToFind, options: .caseInsensitive)
        if range.location != NSNotFound {
            addAttribute(NSForegroundColorAttributeName, value: color, range: range)
        }
    }

    func setColorForAllOccuranceOfText(_ textToFind: String, with color: UIColor) {
        let inputLength = self.string.count
        let searchLength = textToFind.count
        var range = NSRange(location: 0, length: self.length)

        while (range.location != NSNotFound) {
            range = (self.string as NSString).range(of: textToFind, options: [], range: range)
            if (range.location != NSNotFound) {
                self.addAttribute(NSForegroundColorAttributeName, value: color, range: NSRange(location: range.location, length: searchLength))
                range = NSRange(location: range.location + range.length, length: inputLength - (range.location + range.length))
            }
        }
    }
}

이제 다음과 같이 할 수 있습니다.

let message = NSMutableAttributedString(string: "wa ba wa ba dubdub")
message.setColorForText(subtitle, with: UIColor.red) 
// or the below one if you want all the occurrence to be colored 
message.setColorForAllOccuranceOfText("wa", with: UIColor.red) 
// then you set this attributed string to your label :
lblMessage.attributedText = message

그리고 그것을 어떻게 사용할 수 있습니까?
pableiros

1
내 대답을 업데이트, :) 좋은 하루 되세요
Alsh 컴파일러

1

들면 자 마린의 사용자 I 정적이 C # 1 I 문자열 배열 전달 방법, 및 UIColours UIFonts 배열의 배열 (이들은 길이에 일치해야한다). 그런 다음 속성이 지정된 문자열이 다시 전달됩니다.

보다:

public static NSMutableAttributedString GetFormattedText(string[] texts, UIColor[] colors, UIFont[] fonts)
    {

        NSMutableAttributedString attrString = new NSMutableAttributedString(string.Join("", texts));
        int position = 0;

        for (int i = 0; i < texts.Length; i++)
        {
            attrString.AddAttribute(new NSString("NSForegroundColorAttributeName"), colors[i], new NSRange(position, texts[i].Length));

            var fontAttribute = new UIStringAttributes
            {
                Font = fonts[i]
            };

            attrString.AddAttributes(fontAttribute, new NSRange(position, texts[i].Length));

            position += texts[i].Length;
        }

        return attrString;

    }

1

제 경우에는 Xcode 10.1을 사용하고 있습니다. Interface Builder의 레이블 텍스트에서 일반 텍스트와 속성 텍스트 사이를 전환하는 옵션이 있습니다.

여기에 이미지 설명 입력

이것이 다른 사람을 도울 수 있기를 바랍니다 ..!


2
XCode 11.0이 속성 텍스트 편집기를 망가 뜨린 것 같습니다. 그래서 TextEdit를 사용하여 텍스트를 만든 다음 Xcode에 붙여 넣어 보았는데 놀랍도록 잘 작동했습니다.
Brainware

0
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

    }
}

0

내 솔루션은 다음과 같은 방법으로 만들어졌습니다.

-(void)setColorForText:(NSString*) textToFind originalText:(NSString *)originalString withColor:(UIColor*)color andLabel:(UILabel *)label{

NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:originalString];
NSRange range = [originalString rangeOfString:textToFind];

[attString addAttribute:NSForegroundColorAttributeName value:color range:range];

label.attributedText = attString;

if (range.location != NSNotFound) {
    [attString addAttribute:NSForegroundColorAttributeName value:color range:range];
}
label.attributedText = attString; }

동일한 텍스트에서 단 하나의 다른 색상으로 작동했지만 동일한 문장에서 더 많은 색상에 쉽게 적용 할 수 있습니다.


0

아래 코드를 사용하여 단어에 따라 여러 색상을 설정할 수 있습니다.

NSMutableArray * array = [[NSMutableArray alloc] initWithObjects:@"1 ball",@"2 ball",@"3 ball",@"4 ball", nil];    
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] init];
for (NSString * str in array)
 {
    NSMutableAttributedString * textstr = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ ,",str] attributes:@{NSForegroundColorAttributeName :[self getRandomColor]}];
     [attStr appendAttributedString:textstr];
  }
UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(10, 300, 300, 30)];
lab.attributedText = attStr;
[self.view addSubview:lab];

-(UIColor *) getRandomColor
{
   CGFloat redcolor = arc4random() % 255 / 255.0;
   CGFloat greencolor = arc4random() % 255 / 255.0;
   CGFloat bluencolor = arc4random() % 255 / 255.0;
   return  [UIColor colorWithRed:redcolor green:greencolor blue:bluencolor alpha:1.0];
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.