일부러 AutoLayout을 사용하지 않고 UIlabel의 높이를 계산합니다.
AutoLayout의 등장에 따라 고도를 자동으로 계산할 수 있는 수단을 제공하지만, 성능 문제와 종교적 이유로 AutoLayout을 피하는 경우도 있다
이러한 상황에 대처하기 위해 AutoLayout의 UIlabel 높이를 사용하지 않는 계산 방법을 소개합니다.💡
문자열 높이 계산
제목은 UILAbel 높이이고 실제 계산은 문자열 높이입니다.String
NSString
에는 문자열 그리기 영역boundingRect
을 계산하는 방법이 있다.
문서
boundingRectfunc 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
. 만약 순조롭지 못하면 상술한 방법을 시도해 보십시오.👊
Reference
이 문제에 관하여(일부러 AutoLayout을 사용하지 않고 UIlabel의 높이를 계산합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Yaruki00/items/fefcde63fe60526f6ff7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
func boundingRect(with size: CGSize,
options: NSStringDrawingOptions = [],
attributes: [NSAttributedString.Key : Any]? = nil,
context: NSStringDrawingContext?) -> CGRect
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의 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
. 만약 순조롭지 못하면 상술한 방법을 시도해 보십시오.👊
Reference
이 문제에 관하여(일부러 AutoLayout을 사용하지 않고 UIlabel의 높이를 계산합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Yaruki00/items/fefcde63fe60526f6ff7
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(일부러 AutoLayout을 사용하지 않고 UIlabel의 높이를 계산합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Yaruki00/items/fefcde63fe60526f6ff7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)