programing

UI 레이블 높이를 텍스트로 조정

codeshow 2023. 8. 20. 12:58
반응형

UI 레이블 높이를 텍스트로 조정

텍스트에 맞게 높이를 조정하고 싶은 레이블이 몇 개 있습니다. 이것이 제가 지금 작성한 코드입니다.

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

편집:

이 코드에는 문제가 없었기 때문에 문제 자체에 해결책이 있습니다.그것은 여전히 다른 사람들에게 유용할 수도 있습니다!

저는 이것을 놀이터에 막 넣었고 그것은 저에게 효과가 있습니다.

Swift 4.0용으로 업데이트됨

import UIKit

 func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

let font = UIFont(name: "Helvetica", size: 20.0)

var height = heightForView("This is just a load of text", font: font, width: 100.0)

스위프트 3:

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text
    label.sizeToFit()

    return label.frame.height
}

enter image description here

자동 레이아웃을 사용하는 경우 조정할 수 있습니다.UILabel높이는 구성 UI로만 표시됩니다.

iOS8 이상의 경우

  • /레링일약건에 대한 제약 선행 설정UILabel
  • 그리고 다음의 행을 변경합니다.UILabel부터 01시까지

enter image description here

iOS7의 경우

  • 먼저 다음에 대한 포함 높이를 추가해야 합니다.UILabel
  • 그런 다음 관계를 수정합니다.EqualGreater than or Equal

enter image description here

  • 마지막으로, 다음의 행을 변경합니다.UILabel부터 01시까지

enter image description here

당신의.UILabel합니다.

swift 4.1 및 Xcode 9.4.1에서

3단계

1단계)

//To calculate height for label based on text size and width
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat {
    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

2단계)

//Call this function
let height = heightForView(text: "This is your text", font: UIFont.systemFont(ofSize: 17), width: 300)
print(height)//Output : 41.0

3단계)

//This is your label
let proNameLbl = UILabel(frame: CGRect(x: 0, y: 20, width: 300, height: height))
proNameLbl.text = "This is your text"
proNameLbl.font = UIFont.systemFont(ofSize: 17)
proNameLbl.numberOfLines = 0
proNameLbl.lineBreakMode = .byWordWrapping
infoView.addSubview(proNameLbl)

저는 강력한 해결책을 가지고 있습니다.

레이아웃Subviews:

title.frame = CGRect(x: 0, y: 0, width: bounds.width, height: 0)
title.sizeToFit()
title.frame.size = title.bounds.size

텍스트 설정기:

title.text = newValue
setNeedsLayout()

UPD. 물론 이 UI 레이블 설정을 사용합니다.

title.lineBreakMode = .byWordWrapping
title.numberOfLines = 0

원하는 경우 이 확장자를 만듭니다.

extension UILabel {
    func setSizeFont (sizeFont: CGFloat) {
        self.font =  UIFont(name: self.font.fontName, size: sizeFont)!
        self.sizeToFit()
    }
}

아노락님의 답변을 바탕으로 저도 조레이어님의 고민에 동의하기 때문에 UI라벨을 제거하고 CGFloat만 반환하기 위해 몇줄을 추가했는데, 원래 코드가 UI라벨을 추가하지 않아서 도움이 될지 모르겠지만, 오류가 발생하지 않아 아래 코드를 사용하고 있습니다.

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{

    var currHeight:CGFloat!

    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping
    label.font = font
    label.text = text
    label.sizeToFit()

    currHeight = label.frame.height
    label.removeFromSuperview()

    return currHeight
}

설정만으로:

label.numberOfLines = 0

입력한 텍스트 양에 따라 레이블의 높이가 자동으로 조정됩니다.

아노락이 UILabel의 확장에서 계산된 속성으로 제안한 솔루션:

extension UILabel
{
var optimalHeight : CGFloat
    {
        get
        {
            let label = UILabel(frame: CGRectMake(0, 0, self.frame.width, CGFloat.max))
            label.numberOfLines = 0
            label.lineBreakMode = self.lineBreakMode
            label.font = self.font
            label.text = self.text

            label.sizeToFit()

            return label.frame.height
         }
    }
}

용도:

self.brandModelLabel.frame.size.height = self.brandModelLabel.optimalHeight

@Anorak 답변에 이어 문자열에 이 확장자를 추가하고 매개 변수로 삽입을 보냈습니다. 텍스트에 패딩이 필요한 경우가 많기 때문입니다.어쨌든, 여러분 중 일부는 이것이 유용하다는 것을 알게 될 것입니다.

extension String {

    func heightForWithFont(font: UIFont, width: CGFloat, insets: UIEdgeInsets) -> CGFloat {

        let label:UILabel = UILabel(frame: CGRectMake(0, 0, width + insets.left + insets.right, CGFloat.max))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.ByWordWrapping
        label.font = font
        label.text = self

        label.sizeToFit()
        return label.frame.height + insets.top + insets.bottom
    }
}

Swift에서 텍스트 높이를 계산하는 방법은 다음과 같습니다.그런 다음 Rect에서 높이를 얻고 레이블 또는 textView 등의 제약 조건 높이를 설정할 수 있습니다.

let font = UIFont(name: "HelveticaNeue", size: 25)!
let text = "This is some really long text just to test how it works for calculating heights in swift of string sizes. What if I add a couple lines of text?"

let textString = text as NSString

let textAttributes = [NSFontAttributeName: font]

let textRect = textString.boundingRectWithSize(CGSizeMake(320, 2000), options: .UsesLineFragmentOrigin, attributes: textAttributes, context: nil)

레이블에 동적 높이가 필요한 경우 이 메서드를 호출합니다.

func getHeightforController(view: AnyObject) -> CGFloat {
    let tempView: UILabel = view as! UILabel
    var context: NSStringDrawingContext = NSStringDrawingContext()
    context.minimumScaleFactor = 0.8

    var width: CGFloat = tempView.frame.size.width

    width = ((UIScreen.mainScreen().bounds.width)/320)*width

    let size: CGSize = tempView.text!.boundingRectWithSize(CGSizeMake(width, 2000), options:NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: tempView.font], context: context).size as CGSize

    return size.height
}

스위프트 4.0

self.messageLabel = UILabel(프레임: CGRect(x: 70, y: 60, 너비:UISreen.main.bounds.폭 - 80, 높이: 30)

messageLabel.text = message

messageLabel.lineBreakMode = .byWordWrapping //in versions below swift 3 (messageLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping)    
messageLabel.numberOfLines = 0 //To write any number of lines within a label scope

messageLabel.textAlignment = .center

messageLabel.textColor = UIColor.white

messageLabel.font = messageLabel.font.withSize(12)

messageLabel.sizeToFit()

따옴표 NSParagraphStyle을 차단합니다.LineBreakMode는 문단 내 단어가 아닌 전체 문단에 적용됩니다.이 속성은 일반적인 그리기 중이나 경계 상자에 레이블의 텍스트에 맞게 글꼴 크기를 줄여야 하는 경우 모두 적용됩니다.이 속성은 기본적으로 TruncatingTail에 의해 설정됩니다.

이 링크는 스토리보드에서 동일한 작업을 수행하는 방법을 설명합니다.

스위프트 4.0

텍스트/라벨 높이를 계산하는 대신 (동적) 텍스트를 삽입한 후 레이블 크기를 조정합니다.

myLabel이 문제의 UILabel이라고 가정하면 다음과 같습니다.

let myLabel = UILabel(frame: CGRect(x: 0, y: 0, width: *somewidth*, height: *placeholder, e.g. 20*))
myLabel.numberOfLines = 0
myLabel.lineBreakMode = .byWordWrapping
...

이제 재미있는 부분이 나옵니다.

var myLabelText: String = "" {
   didSet {
      myLabel.text = myLabelText
      myLabel.sizeToFit()
   }
}

레이블 높이를 계산하는 Swift 4.1 확장 방법:

extension UILabel {

    func heightForLabel(text:String, font:UIFont, width:CGFloat) -> CGFloat {
        let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.byWordWrapping
        label.font = font
        label.text = text

        label.sizeToFit()
        return label.frame.height
    }

}

스위프트 5, XCode 11 스토리보드 웨이.저는 이것이 iOS 9 이상에서 작동한다고 생각합니다.예를 들어 "설명" 레이블을 사용하여 동적 높이를 가져오려면 다음 단계를 수행합니다.

설명 라벨 선택 -> 속성 검사자로 이동(연필 아이콘), 설정: 라인: 0 줄 바꿈: 워드랩

스토리보드에서 UILabel을 선택하고 Size Inspector(규칙 아이콘)로 이동합니다. 3) "Content Compression Resistance Priority to 1"(라벨, 버튼, 이미지 보기 등)로 이동합니다.

예를 들어 UIImageView, Title Label 및 Description Label이 내 보기에 수직으로 표시됩니다.Content Compression Resistance Priority를 UIImageView로 설정하고 제목 레이블을 1로 설정하고 설명 레이블을 750으로 설정했습니다.이렇게 하면 설명 레이블이 필요한 높이만큼 표시됩니다.

사용할 수도 있습니다.sizeThatFits기능.

예:

label.sizeThatFits(superView.frame.size).height

레이블을 동적으로 빠르게 만들려면 높이 제약을 두지 말고 스토리보드에서 레이블 번호 0도 하단 제약을 줍니다. 이것이 콘텐츠 크기에 따라 동적 레이블을 처리하는 가장 좋은 방법입니다.

UI 레이블에 동적 텍스트가 있는데 높이가 항상 변경되고 아무 것도 작동하지 않는 경우 한 가지 대안은 레이블을 UI 스택 뷰 내부에 배치하는 것입니다.

언급URL : https://stackoverflow.com/questions/25180443/adjust-uilabel-height-to-text

반응형