애플사이다의 iOS 개발 일지

[줄바꿈] UILabel attributedText에 lineBreak 설정 - paragraphStyle.lineBreakMode 본문

iOS

[줄바꿈] UILabel attributedText에 lineBreak 설정 - paragraphStyle.lineBreakMode

Applecider 2022. 12. 20. 07:00

지난 포스트 [줄바꿈] lineBreakMode 및 lineBreakStrategy 차이점을 작성하면서

UILabel에 attributedText를 사용하는 경우에는

label.lineBreakMode가 무시되고, 

attributedText의 paragraphStyle.lineBreakMode를 설정해야 한다는 걸 봤다.

 

근데 실험해보니 잘못된 정보였음.. 🫠🫠🫠

둘 다 사용했을 때 마지막에 설정한 값으로 적용되는 것을 확인했다.


아래처럼 2개 방법으로 코드를 작성해서 비교해봤다.

  • 방법-1. label.lineBreakMode 먼저 -> paragraphStyle.lineBreakMode 나중에 설정
  • 방법-2. paragraphStyle.lineBreakMode 먼저 -> label.lineBreakMode 나중에 설정
private func setupKoreanLayout() {
    // 방법-1. 먼저
    hangulKoreanLabel.lineBreakMode = .byTruncatingMiddle // ✅
    hangulKoreanLabel.lineBreakStrategy = .pushOut

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineBreakMode = .byTruncatingTail // ✅
    paragraphStyle.lineBreakStrategy = .hangulWordPriority

    let text = "이 프로퍼티는 줄임표(…)로 잘라내거나 텍스트를 크으으을리핑하는 등 텍스트 시스템이 해당 컨테이너에 맞지 않는 줄을 배치하는 방법을 제어합니다. 이 속성은 줄임표(…)로 잘라내거나 텍스트를 클리핑하는 등 텍스트 시스템이 해당 컨테이너에 맞지 않는 줄을 배치하는 방법을 제어합니다. 하하."
    let attributedText = NSMutableAttributedString(
        string: text,
        attributes: [.foregroundColor: UIColor.darkGray,
                     .font: UIFont.systemFont(ofSize: 14),
                     .underlineStyle: NSUnderlineStyle.single.rawValue,
                     .paragraphStyle: paragraphStyle])
    hangulKoreanLabel.attributedText = attributedText

    // 방법-2. 나중에
    // hangulKoreanLabel.lineBreakMode = .byTruncatingMiddle // ✅
    // hangulKoreanLabel.lineBreakStrategy = .pushOut
}

방법-1 결과

나중에 호출된 paragraphStyle.lineBreakMode의 설정값이 적용됐다.

방법-2 결과

나중에 호출된 label.lineBreakMode의 설정값이 적용됐다.

공식문서에 따르면 시스템이 label.lineBreakMode를 무시해서 방법-1과 동일한 결과가 나올 거라고 예상했는데

아니었음..

 

결론

둘 다 사용했을 때 마지막에 설정한 값으로 적용되는 것을 확인했다.

 

UILabel - lineBreakStrategy 공식문서에 보면

attributedString이 있는 경우, 시스템은 label.lineBreakMode를 무시하므로
attributedString의 paragraphStyle.lineBreakMode를 설정해야 한다고 설명하고 있는데..

공식문서가 틀린 것 같다..?

아니면 예제 코드에서 NSParagraphStyle 대신 NSMutableParagraphStyle을 써서 그렇거나.. (아마 이게 이유인듯)

 

개인적으로 혼동을 막기 위해 attributedString을 사용할 때는 paragraphStyle.lineBreakMode를 사용하도록

통일하는 게 좋은 방법인 것 같다.

 

검색 키워드 : label attributedText lineBreak

UILabel attributedText with multiple line break modes

 

- Reference

Comments