단일 레이블에 여러 글꼴 색상 사용


88

iOS의 단일 레이블에 두 개 또는 세 개의 글꼴 색상을 사용하는 방법이 있습니까?

"hello, how are you"라는 텍스트가 예로 사용 된 경우 "hello"는 파란색이고 "how are you"는 녹색이됩니다.

이것이 가능합니까, 여러 레이블을 만드는 것보다 쉬운 것 같습니까?


UILabel의 특성 텍스트 속성을 사용해보십시오. stackoverflow.com/questions/3586871/…
rakeshbs

당신은 문자열로 범위의 색상을 추가 할
Kirit 모디

답변:


150

여기에서 참조하십시오.

먼저 NSStringNSMutableAttributedString 을 아래와 같이 초기화하십시오 .

var myString:NSString = "I AM KIRIT MODI"
var myMutableString = NSMutableAttributedString()

있는 viewDidLoad

override func viewDidLoad() {

    myMutableString = NSMutableAttributedString(string: myString, attributes: [NSFontAttributeName:UIFont(name: "Georgia", size: 18.0)!])
    myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSRange(location:2,length:4))
    // set label Attribute
    labName.attributedText = myMutableString
    super.viewDidLoad()
}

산출

여기에 이미지 설명 입력

여러 색상

ViewDidLoad에 아래 줄 코드를 추가하여 문자열에 여러 색상을 가져옵니다.

 myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.greenColor(), range: NSRange(location:10,length:5))

여러 색상 출력

여기에 이미지 설명 입력

스위프트 4

var myMutableString = NSMutableAttributedString(string: str, attributes: [NSAttributedStringKey.font :UIFont(name: "Georgia", size: 18.0)!])
myMutableString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red, range: NSRange(location:2,length:4))

1
두 개의 범위 속성을 추가 할 수 있습니까? 그렇지 않은 경우 어떻게 해결할 수 있습니까?
Justin Rose

58

@Hems Moradiya 용

여기에 이미지 설명 입력

let attrs1 = [NSFontAttributeName : UIFont.boldSystemFontOfSize(18), NSForegroundColorAttributeName : UIColor.greenColor()]

let attrs2 = [NSFontAttributeName : UIFont.boldSystemFontOfSize(18), NSForegroundColorAttributeName : UIColor.whiteColor()]

let attributedString1 = NSMutableAttributedString(string:"Drive", attributes:attrs1)

let attributedString2 = NSMutableAttributedString(string:"safe", attributes:attrs2)

attributedString1.appendAttributedString(attributedString2)
self.lblText.attributedText = attributedString1

스위프트 4

    let attrs1 = [NSAttributedStringKey.font : UIFont.boldSystemFont(ofSize: 18), NSAttributedStringKey.foregroundColor : UIColor.green]

    let attrs2 = [NSAttributedStringKey.font : UIFont.boldSystemFont(ofSize: 18), NSAttributedStringKey.foregroundColor : UIColor.white]

    let attributedString1 = NSMutableAttributedString(string:"Drive", attributes:attrs1)

    let attributedString2 = NSMutableAttributedString(string:"safe", attributes:attrs2)

    attributedString1.append(attributedString2)
    self.lblText.attributedText = attributedString1

스위프트 5

    let attrs1 = [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 18), NSAttributedString.Key.foregroundColor : UIColor.green]

    let attrs2 = [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 18), NSAttributedString.Key.foregroundColor : UIColor.white]

    let attributedString1 = NSMutableAttributedString(string:"Drive", attributes:attrs1)

    let attributedString2 = NSMutableAttributedString(string:"safe", attributes:attrs2)

    attributedString1.append(attributedString2)
    self.lblText.attributedText = attributedString1

38

스위프트 4

다음 확장 기능을 사용하여 속성 문자열에 색상 속성을 직접 설정하고 레이블에 동일하게 적용 할 수 있습니다.

extension NSMutableAttributedString {

    func setColorForText(textForAttribute: String, withColor color: UIColor) {
        let range: NSRange = self.mutableString.range(of: textForAttribute, options: .caseInsensitive)

        // Swift 4.2 and above
        self.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range)

        // Swift 4.1 and below
        self.addAttribute(NSAttributedStringKey.foregroundColor, value: color, range: range)
    }

}

레이블을 사용하여 위의 확장을 시도하십시오.

let label = UILabel()
label.frame = CGRect(x: 60, y: 100, width: 260, height: 50)
let stringValue = "stackoverflow"

let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringValue)
attributedString.setColorForText(textForAttribute: "stack", withColor: UIColor.black)
attributedString.setColorForText(textForAttribute: "over", withColor: UIColor.orange)
attributedString.setColorForText(textForAttribute: "flow", withColor: UIColor.red)
label.font = UIFont.boldSystemFont(ofSize: 40)

label.attributedText = attributedString
self.view.addSubview(label)

결과:

여기에 이미지 설명 입력


@Krunal 색상을 변경하기 위해 여러 문자열을 지원하도록 어떻게 수정할 수 있습니까? 헤더 아래에 ------------가있는 긴 문자열이 있지만 위의 코드는 잘 작동하지만 처음 발견 된 코드에만 색상이 지정됩니다. 모든 문자열을 특정 색상으로 수정하도록 수정할 수 있습니다 ....? 감사.
Omid CompSCI

"flowstackoverflow"와 같은 텍스트에서는 작동하지 않습니다. 첫 번째 흐름 만 변경되지만 마지막 흐름이 필요합니다. 어떻게하면 될까요?
swift2geek

19

Swift 4에 대한 업데이트 된 답변

UILabel의 attributeText 속성 내에서 html을 쉽게 사용하여 다양한 텍스트 서식을 쉽게 수행 할 수 있습니다.

 let htmlString = "<font color=\"red\">This is  </font> <font color=\"blue\"> some text!</font>"

    let encodedData = htmlString.data(using: String.Encoding.utf8)!
    let attributedOptions = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
    do {
        let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)
        label.attributedText = attributedString

    } catch _ {
        print("Cannot create attributed String")
    }

여기에 이미지 설명 입력

Swift 2에 대한 업데이트 된 답변

let htmlString = "<font color=\"red\">This is  </font> <font color=\"blue\"> some text!</font>"

let encodedData = htmlString.dataUsingEncoding(NSUTF8StringEncoding)!
let attributedOptions = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
do {
    let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)
    label.attributedText = attributedString

} catch _ {
    print("Cannot create attributed String")
}

2
이 오류 메시지가 표시됩니다. '(데이터 : NSData, 옵션 : [String : String], documentAttributes : _, 오류 : _)'형식의 인수 목록을 사용하여 'NSAttributedString'형식에 대한 이니셜 라이저를 호출 할 수 없습니다.
Qian Chen

2
Swift 2에 변경 사항이 있습니다. 업데이트 된 답변을 확인하십시오.
rakeshbs

9

여기 Swift 5에 대한 솔루션

let label = UILabel()
let text = NSMutableAttributedString()
text.append(NSAttributedString(string: "stack", attributes: [NSAttributedString.Key.foregroundColor: UIColor.white]));
text.append(NSAttributedString(string: "overflow", attributes: [NSAttributedString.Key.foregroundColor: UIColor.gray]))
label.attributedText = text

여기에 이미지 설명 입력


7

중고 rakeshbs 의 대답은 스위프트 2의 확장을 만들 수 있습니다 :

// StringExtension.swift
import UIKit
import Foundation

extension String {

    var attributedStringFromHtml: NSAttributedString? {
        do {
            return try NSAttributedString(data: self.dataUsingEncoding(NSUTF8StringEncoding)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
        } catch _ {
            print("Cannot create attributed String")
        }
        return nil
    }
}

용법:

let htmlString = "<font color=\"red\">This is  </font> <font color=\"blue\"> some text!</font>"
label.attributedText = htmlString.attributedStringFromHtml

또는 한 줄짜리도

label.attributedText = "<font color=\"red\">This is  </font> <font color=\"blue\"> some text!</font>".attributedStringFromHtml

확장 기능의 좋은 점은 전체 응용 프로그램 .attributedStringFromHtml에서 모든 속성에 대한 속성 이 있다는 것 String입니다.


6

나는 이것을 좋아했다

let yourAttributes = [NSForegroundColorAttributeName: UIColor.black, NSFontAttributeName: UIFont.systemFontOfSize(15)]
let yourOtherAttributes = [NSForegroundColorAttributeName: UIColor.red, NSFontAttributeName: UIFont.systemFontOfSize(25)]

let partOne = NSMutableAttributedString(string: "This is an example ", attributes: yourAttributes)
let partTwo = NSMutableAttributedString(string: "for the combination of Attributed String!", attributes: yourOtherAttributes)

let combination = NSMutableAttributedString()

combination.appendAttributedString(partOne)
combination.appendAttributedString(partTwo) 

이 간단한 것에 감사드립니다.
Nikhil Manapure

6

SWIFT 5 업데이트

func setDiffColor(color: UIColor, range: NSRange) {
     let attText = NSMutableAttributedString(string: self.text!)
     attText.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range)
     attributedText = attText
}

SWIFT 3

내 코드에서 확장을 만듭니다.

import UIKit
import Foundation

extension UILabel {
    func setDifferentColor(string: String, location: Int, length: Int){

        let attText = NSMutableAttributedString(string: string)
        attText.addAttribute(NSForegroundColorAttributeName, value: UIColor.blueApp, range: NSRange(location:location,length:length))
        attributedText = attText

    }
}

그리고 이것은 사용을 위해

override func viewDidLoad() {
        super.viewDidLoad()

        titleLabel.setDifferentColor(string: titleLabel.text!, location: 5, length: 4)

    }


5

스위프트 3.0

let myMutableString = NSMutableAttributedString(
                            string: "your desired text",
                            attributes: [:])

myMutableString.addAttribute(
                            NSForegroundColorAttributeName,
                            value: UIColor.blue,
                            range: NSRange(
                                location:6,
                                length:7))

결과:

더 많은 색상을 원하면 변경 가능한 문자열에 속성을 계속 추가 할 수 있습니다. 여기에 더 많은 예가 있습니다 .


1

Swift 4 UILabel 확장

제 경우에는 레이블 내에서 다른 색상 / 글꼴을 자주 설정할 수 있어야했기 때문에 Krunal 의 NSMutableAttributedString 확장을 사용하여 UILabel 확장을 만들었습니다 .

func highlightWords(phrases: [String], withColor: UIColor?, withFont: UIFont?) {

    let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: self.text!)

    for phrase in phrases {

        if withColor != nil {
            attributedString.setColorForText(textForAttribute: phrase, withColor: withColor!)
        }
        if withFont != nil {
            attributedString.setFontForText(textForAttribute: phrase, withFont: withFont!)
        }

    }

    self.attributedText = attributedString

}

다음과 같이 사용할 수 있습니다.

yourLabel.highlightWords(phrases: ["hello"], withColor: UIColor.blue, withFont: nil)
yourLabel.highlightWords(phrases: ["how are you"], withColor: UIColor.green, withFont: nil)

1

cocoapod Prestyler 사용 :

Prestyle.defineRule("*", Color.blue)
Prestyle.defineRule("_", Color.red)
label.attributedText = "*This text is blue*, _but this one is red_".prestyled()

0

HTML 버전을 사용한 Swift 3 예제.

let encodedData = htmlString.data(using: String.Encoding.utf8)!
            let attributedOptions = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType]
            do {
                let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)
                label.attributedText = attributedString
            } catch _ {
                print("Cannot create attributed String")
            }

0

다음은 2017 년 3 월 현재 최신 버전의 Swift 를 지원하는 코드입니다 .

스위프트 3.0

여기에 대한 Helper 클래스와 메서드를 만들었습니다.

public class Helper {

static func GetAttributedText(inputText:String, location:Int,length:Int) -> NSMutableAttributedString {
        let attributedText = NSMutableAttributedString(string: inputText, attributes: [NSFontAttributeName:UIFont(name: "Merriweather", size: 15.0)!])
        attributedText.addAttribute(NSForegroundColorAttributeName, value: UIColor(red: 0.401107, green: 0.352791, blue: 0.503067, alpha: 1.0) , range: NSRange(location:location,length:length))
       return attributedText
    }
}

메소드 매개 변수에서 inputText : String-레이블 위치에 표시 할 텍스트 : Int-여기서 스타일은 애플리케이션이어야하며 문자열의 시작으로 "0"또는 문자열 길이의 문자 위치로 유효한 값 : Int-From 이 스타일을 적용 할 수있는 문자 수까지의 위치입니다.

다른 방법으로 소비 :

self.dateLabel?.attributedText = Helper.GetAttributedText(inputText: "Date : " + (self.myModel?.eventDate)!, location:0, length: 6)

산출:

여기에 이미지 설명 입력

참고 : UI 색상은 UIColor.red색상으로 정의하거나 사용자 정의 색상으로 지정할 수 있습니다.UIColor(red: 0.401107, green: 0.352791, blue: 0.503067, alpha: 1.0)


0
func MultiStringColor(first:String,second:String) -> NSAttributedString
    {
        let MyString1 = [NSFontAttributeName : FontSet.MonsRegular(size: 14), NSForegroundColorAttributeName : FoodConstant.PUREBLACK]

        let MyString2 = [NSFontAttributeName : FontSet.MonsRegular(size: 14), NSForegroundColorAttributeName : FoodConstant.GREENCOLOR]

        let attributedString1 = NSMutableAttributedString(string:first, attributes:MyString1)

        let attributedString2 = NSMutableAttributedString(string:second, attributes:MyString2)

        MyString1.append(MyString2)

        return MyString1
    }

0

NSForegroundColorAttributeName 을 빠른 하위 버전에서 사용하기 위해 해결되지 않은 식별자 문제를 얻을 수 있습니다 . 위를 NSAttributedStringKey.foregroundColor로 변경하십시오 .

             swift lower version                swift latest version

즉, NSForegroundColorAttributeName == NSAttributedStringKey.foregroundColor


0

스위프트 4.2

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = NSTextAlignment.center

    var stringAlert = self.phoneNumber + "로\r로전송인증번호를입력해주세요"
    let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: stringAlert, attributes: [NSAttributedString.Key.paragraphStyle:paragraphStyle,  .font: UIFont(name: "NotoSansCJKkr-Regular", size: 14.0)])
    attributedString.setColorForText(textForAttribute: self.phoneNumber, withColor: UIColor.init(red: 1.0/255.0, green: 205/255.0, blue: 166/255.0, alpha: 1) )
    attributedString.setColorForText(textForAttribute: "로\r로전송인증번호를입력해주세요", withColor: UIColor.black)

    self.txtLabelText.attributedText = attributedString

결과

결과

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