문자열의 특정 범위의 속성을 변경해보자 NSMutableAttributedString

yim2627·2021년 12월 11일
4

Swift

목록 보기
27/35

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

profile
여러 사람들과 함께 많은 것을 배우고 나누리

0개의 댓글