문제 상황

온보딩 화면에서 줄 간격, 일부분 볼드체 설정을 둘 다 해주어야 함

Untitled

줄 간격을 먼저 설정하고 applyBoldToString을 이용하여 부분 볼드체를 적용하면서

이전에 설정한 줄 간격 attribute가 사라짐

문제 원인

기존 방식은 이전 attribute에 새로 어트리뷰트를 add 하는게 아니고 새로 초기화하는 방식이었기 때문

ex)

func applyBoldToString(targetString: String,
                           font: UIFont = .systemFont(ofSize: 10.0)) {
    let originText = self.text ?? ""
    let range = (originText as NSString).range(of: targetString)
    let attributedString = NSMutableAttributedString(string: originText)
    attributedString.addAttribute(.font, value: font, range: range)
    self.attributedText = attributedString
}

originText로 새로운 AttributedString을 생성하고 add 해주어 기존 attribute 유지되지 않음

해결 방법

func applyBoldToString(targetString: String,
                       font: UIFont = .systemFont(ofSize: 10.0)) {
    let originText = self.text ?? ""
    let range = (originText as NSString).range(of: targetString)
    var attributedString = NSMutableAttributedString(string: originText)
    if let attributedText {
        attributedString = NSMutableAttributedString(attributedString: attributedText)
    }
    attributedString.addAttribute(.font, value: font, range: range)
    self.attributedText = attributedString
}

attributedText가 존재하는 경우, 즉 텍스트에 이전에 설정된 attribute가 있는 경우

attributedText로부터 NSMutableAttributedString을 생성하여 이전 어트리뷰트가 적용된 AttributedString을 불러오고

거기에 새로운 어트리뷰트를 추가하여 문제 해결