Swift에서 NSMutableAttributedString을 사용하여 특정 텍스트의 색상 변경


100

내가 가진 문제는 TextView에서 특정 텍스트의 textColor를 변경할 수 있기를 원한다는 것입니다. 연결된 문자열을 사용하고 있으며 TextView의 텍스트에 추가하는 문자열을 원합니다. 내가 사용하고 싶은 것은 NSMutableAttributedString이지만 Swift에서 이것을 사용하는 방법에 대한 리소스를 찾지 못했습니다. 지금까지 내가 가진 것은 다음과 같습니다.

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

여기에서 textColor를 변경해야하는 단어의 범위를 찾아 속성 문자열에 추가해야한다는 것을 알고 있습니다. 내가 알아야 할 것은 attributeString에서 올바른 문자열을 찾은 다음 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에서 동일한 코드를 다시 작성해 보셨습니까?
아론 Brager

다음은 정말 좋은 대답입니다. 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과 함께 'add attribute'를 사용합니다.

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

설정할 수있는 추가 표준 속성 목록은 Apple 문서 에서 찾을 수 있습니다.


20
IOS에 대한 사용 UIColor - NSColor는 OSX 아니라
스티브 오코너

1
var main_string = "Hello World Hello World Hello World"가 있고 전체 문자열의 "World"에 색상을 적용해야하는 경우 어떻게합니까?
msmq

main_string, string_to_colorrange변형 된 적이 없습니다. let상수로 변경 하시겠습니까?
Cesare

좋은 솔루션입니다. 당신은 내 하루를 구했습니다.
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 : ...) 작동합니까?
Hatim

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.helpTextA는 UILabel콘센트.


1
오 크리스, 당신은 나의 영웅입니다. 이 코드 블록을 오랫동안 찾고 있습니다.
Pan Mluvčí

@chris. 나는 텍스트 뷰에 nsmutableattributed 문자열을 변경하려면, 그 수
우마 마드 하비

그것은 한 단어로 작동하지만 내 문자열에는 여러 단어가 있지만 색상 변경이지만 그 단어의 색상도 빨간색이라는 빨간색 단어 뒤에 씁니다.있는 경우 어떤 해결책을 줄 수 있습니까?
Dhaval Solanki

도와 주셔서 감사합니다!
ssowri1

18

Swift 4.2Swift 5 는 문자열의 일부를 채색합니다.

문자열을 확장하는 동안 NSMutableAttributedString을 사용하는 매우 쉬운 방법입니다. 이것은 전체 문자열에서 하나 이상의 단어를 채색하는 데에도 사용할 수 있습니다.

확장자를위한 새 파일을 추가합니다. File-> New-> ex. "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 귀하의 요구 사항은 정확히 무엇입니까?
아 누락 샤르마

textview에서 글꼴 크기 및 글꼴 색상을 변경하고 싶습니다. nsmutableattributedstring에서 얻고 있습니다.
우마 마드 하비

@UmaMadhavi이 link1link2 확인 하십시오 . 도움이 될 수 있습니다!
아 누락 샤르마

글꼴을 사용할 수없는 경우 충돌합니다.
SafeFastExpressive

10

Chris의 대답은 저에게 큰 도움이 되었기 때문에 그의 접근 방식을 사용하여 재사용 할 수있는 기능으로 전환되었습니다. 이렇게하면 나머지 문자열에 다른 색상을 부여하면서 하위 문자열에 색상을 할당하겠습니다.

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

스위프트 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

스위프트 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.
Bjorn Roche

트윗 담아 가기 어떻게이 텍스트 뷰 가능합니다
우마 마드 하비

@UmaMadhavi은 ... 당신은 ... 그것은 작동합니다 ..... self.textView.attributedText = myMutableString를 추가 할 필요가
사라 짓 싱

4

색상, 글꼴 등과 같은 다른 스타일로 레이블을 수행하는 가장 쉬운 방법은 Attributes Inspector에서 "Attributed"속성을 사용하는 것입니다. 텍스트의 일부를 선택하고 원하는대로 변경하기 만하면됩니다.

여기에 이미지 설명 입력


1
당신은 프로그래밍 방식으로 문자열을 변경하지 않는 Suposing
알레한드로 Cumpa

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

스위프트 4.1

나는 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

cocoapod Prestyler를 확인하십시오 :

Prestyler.defineRule("$", UIColor.orange)
label.attributedText = "This $text$ is orange".prestyled()

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.