IT

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

lottoking 2020. 9. 6. 10:20
반응형

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


내가 가진 문제는 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를 변경하고 싶기 때문에 처리하는 도우미 함수를 만들 것이지만이 text


질문에 다소 대답했지만 질문에 대답하기 위해 정규식을 사용하지 않고 약간 더 간결한 방법을 제공하기 위해 :

텍스트 길이의 색상을 변경할 문자의 시작 및 끝 색인을 알아야합니다.

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 문서 에서 사용할 수 있습니다.


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

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


답변은 이미 이전 게시물에서 제공하는 방법이 있습니다.

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

이것이 누구에게나 도움이되기를 바랍니다!


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
}

스위프트 4.1

NSAttributedStringKey.foregroundColor

예를 들어 NavBar에서 글꼴을 변경하려는 경우 :

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

이 확장 프로그램을 사용할 수 있습니다.

신속한 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)
   }

}


Swift 4.2Swift 5 는 일부를 채색합니다.

String을 확장하는 동안 NSMutableAttributedString을 사용하는 매우 쉬운 방법입니다. 이 또한 전체 많은 곳에서 둘 이상의 단어를 채색하는 데 사용할 수 있습니다.

가입을위한 새 파일을 추가합니다. 파일-> 새로 만들기-> 예를 들어 이름이있는 새 파일. "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로 텍스트 채색을 사용하는 예


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

문자열 확장을 만들기 전에 답변을 기반으로

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)

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

여기에 이미지 설명 입력


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

잘 작동


신속한 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

" 텍스트의 여러 단어에 특정 색상 적용 "을 찾는 모든 사람을 위해 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


이것은 당신을 위해 일할 수 있습니다

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

글꼴 색상의 색상을 변경하려면 먼저 아래 이미지와 같이 일반 대신 속성을 선택하십시오.

그런 다음 속성 필드에서 텍스트를 선택한 다음 정렬의 오른쪽에있는 색상 버튼을 선택해야합니다. 색상이 변경됩니다.


이 방법을 사용할 수 있습니다. 이 방법을 공통 유틸리티 클래스에서 구현하여 전역 적으로 액세스했습니다.

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
}

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

이렇게하는 아주 쉬운 방법.

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


속성 문자열의 매개 변수가 아니라 textview 매개 변수를 변경해야합니다.

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

cocoapod Prestyler를 확인하십시오 :

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

참고 URL : https://stackoverflow.com/questions/25207373/changing-specific-texts-color-using-nsmutableattributedstring-in-swift

반응형