UILabel의 높이를 문자 수로 동적으로 변경

테마



UILabel의 높이를 문자수로 동적으로 변경합니다.

경위



서버에서 얻은 문자열을 기반으로,
UILabel의 높이를 동적으로 변경해야했습니다.
그때 메모를 공유합니다.

구현 절차


  • UILabel을 StoryBoard에 배치하고 numberOfLines를 0(Storyboard에서는 Lines)으로 변경한다.
  • UILabel의 높이 제약(Constraints)을 설정해, 소스 코드와 관련짓는다.
  • UILabel의 높이를 취득하는 extension를 작성합니다.
  • 화면 사이즈와 폰트 사이즈를 지정해, 높이를 취득한다.
  • UILabel의 높이를 갱신한다.

  • 그럼 해보겠습니다.

    1. UILabel을 StoryBoard에 배치하고 numberOfLines를 0(Storyboard에서는 Lines)으로 변경합니다.



    이 설정을 잊으면 한 줄로 표시됩니다.
    (한 줄에 맞지 않으면 "..."로 생략됩니다.)





    2. UILabel의 높이 제약(Constraints)을 설정하고 소스 코드와 연관시킨다.



    높이 제약은, 나중에 바꾸므로 적당해도 괜찮습니다.



    StoryBoard에서 Outlet으로 소스 코드와 연결합니다.

    UIViewController.swift
        @IBOutlet weak var heightConstrainsts: NSLayoutConstraint!
        @IBOutlet weak var textLabel: UILabel!
    
    

    연결이 완료되면 제약 조건이 아래와 같은 디스플레이로 바뀝니다.


    3. UILabel의 높이를 얻는 extension을 만듭니다.



    String.swift
    import UIKit
    
    extension String {
    
        func getTextSize(font:UIFont, viewWidth:CGFloat, padding:CGFloat) -> CGSize {
            var size = CGSizeZero
    
            if let s:CGSize = self.makeSize(viewWidth, font: font) {
                size = CGSize(width: s.width, height: s.height + padding)
            }
            return size
        }
    
        func makeSize(width:CGFloat, font:UIFont) -> CGSize {        
            var size:CGSize = CGSizeZero
    
            if self.respondsToSelector("boundingRectWithSize:options:attributes:context:") {
                let bounds:CGSize = CGSize(width: width, height: CGFloat.max)
                let attributes: Dictionary = [NSFontAttributeName: font]
                let options = unsafeBitCast(NSStringDrawingOptions.UsesLineFragmentOrigin.rawValue |
                    NSStringDrawingOptions.UsesFontLeading.rawValue, NSStringDrawingOptions.self)
    
                let rect:CGRect = self.boundingRectWithSize(bounds, options: options, attributes: attributes, context: nil)
                size = CGSize(width: rect.size.width, height: rect.size.height)
            }
            return size
        }
    }
    
    

    4. 화면 크기와 글꼴 크기를 지정하고 높이를 얻습니다.



    이번에는 아래와 같은 예로 설명합니다.


    설정 요소
    설정값


    View 폭
    UILabel의 너비를 화면 크기의 90%

    글꼴 크기
    17.0



    UIViewController.swift
            let viewWidth = UIScreen.mainScreen().bounds.width * 0.9
            let textSize = text.getTextSize(UIFont.systemFontOfSize(17),viewWidth: viewWidth, padding: 8)
            textLabel.text = text
    
    

    5. UILabel 높이를 업데이트합니다.



    UIViewController.swift
            heightConstrainsts.constant = textSize.height
    

    확인해 보겠습니다.



    [3행 표시의 경우]


    [조금 긴 문자열을 설정한 경우]


    [개행 코드가 포함된 문자열을 설정한 경우]


    요약



    안전하고 동적으로 UILabel의 높이를 변경할 수있었습니다.

    실수나 더 좋은 방법이 있다면 교수하십시오.

    좋은 웹페이지 즐겨찾기