애플사이다의 iOS 개발 일지

[줄바꿈] lineBreakMode 및 lineBreakStrategy 차이점 - 둘 다 필요할지도 본문

iOS

[줄바꿈] lineBreakMode 및 lineBreakStrategy 차이점 - 둘 다 필요할지도

Applecider 2022. 12. 18. 07:00

lineBreakMode, lineBreakStrategy는 둘 다 필요할까?

결론부터 말하자면 원하는 스타일에 따라 둘 다 필요할 수도 있다.

 

UILabel의 텍스트가 길어질 때
한글 단어 기준으로 줄바꿈하기 위해 lineBreakStrategy = .hangulWordPriority를 사용한 적이 있었는데,

이때 lineBreakStrategy가 lineBreakMode를 대체 가능한 거라고 착각했다.

근데 아니었음..

 

둘의 차이점을 알아보자.


결론

아래 같은 스타일로 구현하고 싶다면

lineBreakMode, lineBreakStrategy 둘 다 필요하다.


1. lineBreakMode

공식문서를 보자.

NSParagraphStyle - lineBreakMode

 

음? 공식문서에 첫 문단에 정답이 있었다.

  • linebreakMode는 텍스트가 컨테이너보다 넘칠 때, 텍스트를 배치하는 방법을 조절한다.
    예를 들면 텍스트 끝부분을 ...으로 자르거나, 텍스트를 자르는 방법이 있다.
  • lineBreakStrategy와 다른데,
    lineBreakStrategy는 줄바꿈을 문단 중 어디에 배치할지를 조절한다.

직접 Label에 Enum - NSLineBreakMode 를 적용해보면 쉽게 이해할 수 있다.

예제 코드를 작성해봤다.

모두 numberOfLine = 3으로 설정했다.

  • byWordWrapping : 영단어 (Word) 단위로 감싸서 줄바꿈을 한다. 줄바꿈으로 인해 영단어가 쪼개지지 않도록 한다는 뜻
  • byCharWrapping : 문자 (Charactor) 단위이므로 줄바꿈으로 인해 영단어가 쪼개진다.
  • byTruncatingTail : 텍스트 끝부분을 ...으로 자른다. 그리고 영단어가 쪼개지지 않는다.
    그래서 이커머스 앱의 상품목록 화면에서 이 값을 주로 사용한다. ✨✨✨
    엥.. 원래 한글 단어는 쪼개지는 문제가 생겼었는데 애플이 업데이트해준 건가.. 왜 멀쩡하지?
  • byTruncatingMiddle : 컨테이너 마지막 줄에서 중간 부분을 ...으로 표시한다.
  • byClipping : 영단어가 쪼개지지 않고, ... 없이 텍스트가 끊기는 곳에서 문자가 잘린다.

🔍 UILabel의 default lineBreakMode값은 뭘까?

NSLineBreakMode 문서를 뒤져봐도 안나왔는데, 알고 보니 UILabel - lineBreakMode 문서가 따로 있었다.

  • attibutedText 미사용 시 : lineBreakMode가 text 프로퍼티의 문자열 전체에 직접 적용된다.
  • attributedText 사용 시 : lineBreakMode가 attributedText 프로퍼티의 문자열 전체에 직접 적용된다.
  • 일부 문자열에만 적용하려면 별도의 attributedText를 생성하고 lineBreakMode를 적용해야 한다. 
  • NSParagraphStyle 프로퍼티는 단어가 아니라 문단 전체에 적용된다.
    - ParagraphStyle 설정값이 text/attributedText 설정값보다 우선시된다는 뜻인듯?
    - ParagraphStyle : attributedText에 적용되는 문단 스타일이다.
  • default는 .byTruncatingTail이다.

2. lineBreakStrategy

위에서 설명했듯이 lineBreakStrategy는 줄바꿈을 문단 중 어디에 배치할지를 조절한다.

공식문서 NSParagraphStyle - lineBreakStrategy를 보자.

  • lineBreakMode와의 차이점을 다시 설명한다.
  • lineBreakMode가 multiple lines를 지원하지 않는 .byClipping인 경우, lineBreakStrategy를 무시한다.
  • default값은 none이라고 되어있는데, UILabel - lineBreakStrategy을 보면 default값은 .standard이다.

lineBreakStrategy의 종류는 enum이 아니라 structure 및 static 프로퍼티로 구현되어있다.

lineBreakStrategy가 비교적 최근에 추가돼서 그런듯?

Structure - NSParagraphStyle.LineBreakStrategy를 보자.

 

이것도 예제 코드를 보면 쉽다.

  • .hangulWordPriority : 줄바꿈으로 인해 한글 단어가 쪼개지지 않도록 한다.
    lineBreakMode의 byTruncatingTail (default)만 쓰면, 영단어는 쪼개지지 않지만 한글 단어가 쪼개지는 문제가 있었다.
    그래서 애플이 친절하게 이걸 추가해줬다. 당연히 한글을 쓰는 대부분의 상용 앱에서 활용한다. ✨✨✨
  • .pushOut : 마지막 줄에 남겨진 단어가 동떨어지는 것을 방지하기 위해 개별 line을 밀어낸다. 

3. lineBreakMode + lineBreakStrategy 둘 다 쓰기

🔍 그렇다면 lineBreakMode = .byWordWrapping / .byTruncatingTail / .byTruncatingMiddle에다가

모두 lineBreakStrategy = .hangulWordPriority를 적용하면 어떻게 될까? 

  • 당연히 모두 한글 단어를 쪼개지 않은 채로 줄바꿈된다.
    원하는 스타일에 따라 사용하면 될듯
  • .byWordWrapping + .hangulWordPriority : 텍스트 끝이 ... 처리되지 않는다.
  • .byTruncatingTail + .hangulWordPriority : 텍스트 끝이 ... 처리된다.
  • .byTruncatingMiddle + .hangulWordPriority : 컨테이너 마지막 줄에서 텍스트 중간이 ... 처리된다.

예제 코드는 GitHub repo에 업데이트했다.

 

참고로 검색하면서 UILabel에 attributedText를 사용하는 경우에는

label.lineBreakMode가 무시되고, 

attributedText의 paragraphStyle.lineBreakMode를 설정해야 적용된다는 걸 봤다.

 

다음에 포스팅할 예정이다.

- 검색 키워드 : label attributedText lineBreak

- UILabel attributedText with multiple line break modes

 

- Reference

 

🍎 포스트가 도움이 되었다면, 공감🤍 / 구독🍹 / 공유🔗 / 댓글✏️ 로 응원해주세요. 감사합니다.

Comments