NSMutableAttributedString
하나의 레이블에서 특정 부분만 폰트나 사이즈를 변경해주고싶었는데..
범위를 지정해서 특정 범위에 있는 문자열을 빼오고 원래의 문자열의 특정범위를 빈값으로 변경해버린 뒤 빼온 문자열의 폰트를 변경해 주고.. 다시 원래의 문자열에 더해준다..
너무 복잡하다.
그러다 이런걸 발견했다.
NSMutableAttributedString은 문자열의 속성을 변경할 수 있는 문자열의 타입이다.
let attributedString = NSAttributedString(string: cell.customLabel.text ?? "")
해당 타입의 이니셜라이저를 사용하여 String타입의 문자열을 NSMutableAttributedString 타입의 문자열로 반환(변경)한다.
타입을 변경한 후 NSMutableAttributedString 인스턴스 메소드인 addAttribute를 사용하여 문자열 특정 범위의 속성을 변경할 수 있다.
addAttribute 메소드의 첫번째 파라미터는 문자열의 변경하고 싶은 속성을 선택하는 것이다.
음.. 보다시피 속성은 굉장히 많다.
나는 폰트를 변경해주고 싶기에 font를 선택하였다.
두번째 파라미터는 첫번째 파라미터에서 선택한 변경하고싶은 속성의 값
즉, font면 font의 사이즈라던지, 굵기, 폰트 스타일등을 지정해 주는 것이다.
변경하고 싶은 속성을 font로 설정해놓고, 속성의 값을 지정해줄 때 font관련 값이 아닌 것을 넣으면 아래와 같이 런타임 에러가 발생한다.
문자열의 특정 범위의 속성에 들어가 값을 변경해주는 건데, 속성에 들어갔더니 웬 이상한 값을 들고와갖고 빠꾸먹는거다.
정장파티 한다니깐 파자마 입고 가는 꼴이다. 그럼 당연히 빠꾸먹겠지.
그리고 세번째 파라미터는 range라는 네이밍에서 알 수 있듯 원하는 속성으로 변경해줄 문자열의 특정 범위를 지정해주는 파라미터이다.
guard let customText = cell.customLabel.text else {
return .init()
}
let attributedString = NSMutableAttributedString(string: customText)
attributedString.addAttribute(.font, value: UIFont.italicSystemFont(ofSize: 25), range: (customText as NSString).range(of: "Hello"))
cell.customLabel.attributedText = attributedString
위 코드는 문자열의 Hello 부분을 지정한 속성을 적용시키겠다는 것이다.
전체 코드를 적용시켜보면
다른 방법으로는 문자열을 추가해주는 방식(반환) 이 있다.
extension NSMutableAttributedString {
func italic(string: String, fontSize: CGFloat) -> NSMutableAttributedString {
let font = UIFont.italicSystemFont(ofSize: fontSize)
let attributes: [NSAttributedString.Key: Any] = [.font: font]
self.append(NSAttributedString(string: string, attributes: attributes))
return self
}
func normal(string: String, fontSize: CGFloat) -> NSMutableAttributedString {
let font = UIFont.systemFont(ofSize: fontSize)
let attributes: [NSAttributedString.Key: Any] = [.font: font]
self.append(NSAttributedString(string: string, attributes: attributes))
return self
}
}
cell.customLabel.attributedText = NSMutableAttributedString()
.italic(string: "Hello", fontSize: 20)
.normal(string: ", Everyone", fontSize: 15)
내가 사용해야할 상황에 대입해보면..
문자열의 Prefix부분을 먼저 추가해주고, json으로 파싱해온 값을 normal 속성으로 추가해주면 될 것 같다.
https://stackoverflow.com/questions/28496093/making-text-bold-using-attributed-string-in-swift
'iOS > Swift' 카테고리의 다른 글
Swift) Subscript (0) | 2022.02.13 |
---|---|
Swift) Dynamic Type, Accessibility Inspector (0) | 2022.02.13 |
Swift) Codable, Decode, Encode (0) | 2022.02.13 |
Swift) TableView (0) | 2022.02.13 |
Swift) Delegate (0) | 2022.02.13 |
댓글