Weekoding

[Swift] Label의 문자열 일부 변경하기(크기, 색상) 본문

공부 노트(Swift)

[Swift] Label의 문자열 일부 변경하기(크기, 색상)

Weekoding 2023. 6. 25. 23:58

Label을 사용할 때, 크기나 색상이 일관적이지 않은 경우를 보았을 것이다.

보통 특정 문자를 강조할 때 사용되고, 때에 따라서는 버튼으로 유도되기도 한다.

"사용자"와 "5일"에 다른 폰트 스타일이 적용된 모습

크기나 색이 다른 부분을 각각 다른 Label로 사용해서 구현할 수도 있겠지만,

레이아웃을 걸기가 까다로워지며 재사용성도 떨어진다.

 

한 Label의 문자열 내에서 일부의 크기나 색상을 변경하는 방법에 대해서 알아보고, 구현해보도록 하자. 

 

 

📂 NSMutableAttributedString

A mutable string with associated attributes (such as visual style, hyperlinks, or accessibility data)
for portions of its text.

: 텍스트 일부(portions)에 대해, 연관된 속성(시각적 스타일, 하이퍼링크, 접근가능한 데이터 등)을 바꿀 수 있는 string.

즉, 부분적으로 텍스트에 속성을 적용할 때 사용되는 클래스이다.

 

addAttribute(_: value:range:)

: 특정 range의 문자(혹은 문자열)에 주어진 특성의 이름(Key)에 맞는 value를 추가한다. 

attributedStr.addAttribute(.font, value: fontSize, range: (myLabel.text! as NSString).range(of: "사용자"))
attributedStr.addAttribute(.foregroundColor, value: UIColor.blue, range: (myLabel.text! as NSString).range(of:"5일"))

Swift의 String은 range: 파라미터에 넣을 NSRange라는 속성을 갖지 않고 있기 때문에,

NSString으로의 타입 캐스팅(형변환)이 필요하다. 사용시 필요한 파라미터는 세 가지가 있다.

  • NSAttributedString.Key: String에 적용할 수 있는 특성들에 대한 키 값.
    • ex) .font, .backgroundColor, .underlineStyle, etc...
  • value: Key값에 따라, 적용할 특성에 대한 값(Key에 따라 UIColor, Int등 달라진다)
  • range: 적용할 String의 범위

 

.attributedText

: label이 보여줄 'styled text'를 지정한다.

myLabel.attributedText = attributedStr

 

📂 NSAttributedString?

일부 예제에서는 위 예제에 대해 NSAttributedString을 사용하는 곳도 있었다.

차이점만 간단히 알아보았다.

  NSAttributedString NSMutableAttributedString
변경 가능 여부(동적 수정) 불가능 가능

NSAttributedString 객체를 생성하여 한번 적용하면 그 객체의 값은 바꿀 수 없다.

Label이 동적으로 수정될 일이 필요하다면 NSMutableAttributedString을 사용하도록 하자.

 

 

 

📌 최종 코드

//value로 사용할 내가 적용하고싶은 폰트 사이즈 객체 생성
let fontSize = UIFont.boldSystemFont(ofSize: 30)

//NSMutableAttributedString객체를 생성한다.(label에 있는 Text를 이용한다.)
let attributedStr = NSMutableAttributedString(string: myLabel.text!)

//위에서 만든 attributedStr에, addAttribute()메소드를 통해 스타일 적용.
attributedStr.addAttribute(.font, value: fontSize, range: (myLabel.text! as NSString).range(of: "사용자"))
attributedStr.addAttribute(.foregroundColor, value: UIColor.blue, range: (myLabel.text! as NSString).range(of:"5일"))
        
//최종적으로 내 label에 text가 아닌, attributedText를 적용
myLabel.attributedText = attributedStr

 

 

 

 

오류 및 지적사항은 댓글로 남겨주시면 감사하겠습니다!

참고 : https://zeddios.tistory.com/300

Comments