Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

teunteun2

[Swift] Extension NSMutableAttributedString 본문

iOS

[Swift] Extension NSMutableAttributedString

teunteun2 2022. 5. 8. 22:54

사실 밑의 링크가 2편이고 해당 콘텐츠가 1편입니다. 더 뒤늦게 올리네용

https://teunteun2.tistory.com/10

 

[Swift] GestureRecognizer&TextKit 으로 UILabel text 클릭 이벤트 발생시키기

인스타그램 클론코딩을 하면서 'avatar1 첫번째 게시물' 부분을 하나의 UILabel로 만들어주었다. NSMutableAttributedString을 통해 폰트와 굵기 등의 스타일은 다르게 주었지만 사용자아이디를 눌렀을 때

teunteun2.tistory.com

 

인스타그램 클론코딩을 하면서 최대한 디테일한 부분까지 신경쓰려고 노력했는데 그 부분 중 하나가 게시물 content 부분인 것 같다. UserName과 Content 부분이 분명 하나의 Label인데 굵기도 다르고 심지어 어딜 누르냐에 따라 뷰 이동이 다르다.

  1. 우선 하나의 Label로 만든 후 유저아이디와 콘텐츠 부분의 굵기를 다르게 해주기 위해 extension으로 메서드를 만들었다.

string.append -> NSAttributedString을 추가할 수 있다. 영역 지정 X

string.setAttributes -> 추가된 NSAttributedString 내에서 range에 따라 attributes를 다르게 설정할 수 있다

extension NSMutableAttributedString {
   
   func changeWeight(to weight: UIFont.Weight, content: String, targetString: String, size: CGFloat = 12) -> NSMutableAttributedString{
       
       let font = UIFont.systemFont(ofSize: size, weight: weight)
       self.append(
           NSAttributedString(string: content,attributes: [.font: UIFont.systemFont(ofSize: size, weight: .regular)])
         )
       
       let attributes: [NSAttributedString.Key: Any] = [.font: font]
       self.setAttributes(attributes, range: (string as NSString).range(of: targetString))
       
       return self
   } 
}
  1. fullContent 는 유저아이디와 콘텐츠를 합친 String
fullContent = "\(postData.name) \(postData.content)"
  1. fullContent willSet 정의
var fullContent: String = "" {
       willSet {
           contentLabel.attributedText = NSMutableAttributedString()
               .changeWeight(to: .medium, content: newValue, targetString: postUserName)
       }
   }