[TIL] NSMutableAttributedString

7과11사이·2023년 11월 1일
0

스파르타코딩클럽

목록 보기
86/90

파이널 프로젝트에서 메인 화면을 이어받아 진행하게 됐다.
다른 팀원들은 이미 너무 많은 부분을 담당하고 있어서 내가 맡겠다 한 부분이었는데,
메인 페이지에서 생각보다 다시 한번 생각해보게 되거나 사용해본 적 없는 코드가 있어 정리해본다.


NSMutableAttributedString

MARK: - 구현 방식
//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


MARK: - 실구현 코드
private lazy var recommendedLabel = UILabel().then {
        let text = "로컬들이 추천해 주는 내 주변 찐 맛집!"
        let bigFont = FontGuide.size16Bold
        let biggerFont = FontGuide.size24Bold
        
        let attributedStr = NSMutableAttributedString(string: text)
        attributedStr.addAttribute(.font, value: biggerFont, range: (text as NSString).range(of: "찐"))
        attributedStr.addAttribute(.font, value: bigFont, range: (text as NSString).range(of: "맛집"))
        
        attributedStr.addAttribute(.foregroundColor, value: ColorGuide.main, range: (text as NSString).range(of: "찐"))
        $0.attributedText = attributedStr
        $0.translatesAutoresizingMaskIntoConstraints = false
    }

하나의 String 값에 UIFont부터 색상을 상황에 따라 다르게 적용해야 했다.
이전 구현 방식은 Label들을 각각 만들어서 stackView에 묶는 형식으로 구성이 돼있었는데, 구현하는데 문제는 없으나 약간의 아쉬움이 있었다.

1. 값을 바꾸기 위해서 하나 하나 찾아야 한다는 점
2. 한 줄의 텍스트를 위해 3개의 UIComponent가 생성되어야 한다는 점
이 두가지가 가장 큰 것 같다.

그래서 해결 방안을 찾아보다 NSMutableAttributedString를 발견했는데, 기존에 보던 타입이 아니었다.
NSAttributedString은 종종 사용했던 것 같다.
동일하게 String 값에 속성들을 부여할 수 있는 타입으로, 색상이나 기울기 등을 적용할 때 사용했었다.
NSMutableAttributedString을 찾아보면서 알게 되었지만 말그대로 Mutable이 있고 없고의 차이가 있었다.

NSAttributedString은 읽기 전용이라고!
하지만 애초에 어떤 값이 주어질지 정리하고 출력하기 때문에 읽기와 쓰기의 개념이 어떻게 적용이 되는지 모르겠다. 보다보니 이해가 된다. String 값을 이미 길게 적용했다면 필요한 부분으로 다시 이동해서 하나 하나 값을 바꾸고 있는 상황이 오히려 시간 소비를 더 할 것 같다는 생각이 든다. replaceCharacters, setAttributes 함수는 쉽게 바꾸는데 수고를 덜어줄 것 같다.

아무튼 NSMutableAttributedString에 대해 찾아본 내용은 아래와 같았다.
링크를 걸거나 시각적인 요소를 텍스트에 적용하기 위해 사용하는 변경 가능한 String이었다.

해당 타입(클래스)에는 지정한 영역의 값에 속성을 더할 수 있는 함수가 있었다.
GPT야 고마워...


UIcollectionViewFlowLayout

컬렉션을 추가로 정리하면서 이전에 한번 찾아본 FlowLayout 관련해서도 조금은 더 이해해보면 좋겠다는 생각이 들었다.

추후 정리!

0개의 댓글

관련 채용 정보