일부러 AutoLayout을 사용하지 않고 UIlabel의 높이를 계산합니다.

9463 단어 iOSSwift
iOS 엔지니어에게 고도의 계산은 줄곧 매우 주목할 대상이었다🔍
AutoLayout의 등장에 따라 고도를 자동으로 계산할 수 있는 수단을 제공하지만, 성능 문제와 종교적 이유로 AutoLayout을 피하는 경우도 있다
이러한 상황에 대처하기 위해 AutoLayout의 UIlabel 높이를 사용하지 않는 계산 방법을 소개합니다.💡

문자열 높이 계산


제목은 UILAbel 높이이고 실제 계산은 문자열 높이입니다.StringNSString에는 문자열 그리기 영역boundingRect을 계산하는 방법이 있다.
문서
boundingRect
func boundingRect(with size: CGSize, 
          options: NSStringDrawingOptions = [], 
       attributes: [NSAttributedString.Key : Any]? = nil, 
          context: NSStringDrawingContext?) -> CGRect
표시할 너비가 고정되어 있으므로 첫 번째 매개변수size에 너비의 치수를 지정합니다.먼저 높이를 큰 수치로 설정한다.
문자 그리기 옵션을 두 번째 인자options에 제출합니다.문서에는 여러 줄의 높이를 정확하게 계산해야 한다고 쓰여 있다.usesLineFragmentOrigin.글씨체에 따라 교부.usesFontLeading가 되지 않으면 높이가 작게 계산되기 때문에 미리 지정하는 것이 좋다.
문자열 속성을 세 번째 매개 변수attributes에 전달합니다.글꼴과 행 간격을 지정합니다.
네 번째 인자context에 문자열을 전달하는 환경입니다.nil 이후 기본값이 사용됩니다.
반환 값은 드로잉 영역이지만 값이 작기 때문에 ceil()를 사용하여 정수로 변환합니다.
이번 목적은 UILAbel의 높이, 너비와 문자열의 속성을 계산하는 것입니다.문자열의 크기를 계산할 때 외부에서 전송된 값을 사용할 수 있습니다.
위의 내용을 요약하여 String의 extension을 만듭니다.
문자열의 높이를 계산하는 방법
extension String {

    func makeSize(width: CGFloat, attributes: [NSAttributedString.Key: Any]) -> CGSize {
        let bounds = CGSize(width: width, height: .greatestFiniteMagnitude)
        let options: NSStringDrawingOptions = [.usesLineFragmentOrigin, .usesFontLeading]
        let rect = self.boundingRect(with: bounds, options: options, attributes: attributes, context: nil)
        let size = CGSize(width: rect.size.width, height: ceil(rect.size.height))
        return size
    }
}

UIlabel 높이 계산


이것은 단지 자신의 너비와 속성을 상술한 방법에 맡길 뿐이다.
순수한 텍스트와 유속성 텍스트를 각각 준비하는 방법.
UILAbel의 extension으로 정의합니다.
UIlabel 높이 계산 방법
extension UILabel {

    func getTextHeight() -> CGFloat {
        guard let text = self.text else {
            return 0.0
        }
        let attributes: [NSAttributedString.Key: Any] = [.font : self.font]
        let size = text.makeSize(width: self.bounds.width, attributes: attributes)
        return size.height
    }

    func getAttributedTextHeight() -> CGFloat {
        guard let attributedText = self.attributedText else {
            return 0.0
        }
        var attributes: [NSAttributedString.Key: Any] = attributedText.attributes(at: 0, effectiveRange: nil)
        attributes[.font] = self.font
        let size = attributedText.string.makeSize(width: self.bounds.width, attributes: attributes)
        return size.height
    }
}
이렇게 하면 UIlabel의 높이를 계산할 수 있습니다!

끝맺다


여기까지 썼는데 생각났어요. sizeThatFits()라는 방법이 있죠.🙀
이것저것 지정할 수 없습니다NSStringDrawingOptions. 만약 순조롭지 못하면 상술한 방법을 시도해 보십시오.👊

좋은 웹페이지 즐겨찾기