[ios] UILabel 높이를 텍스트로 조정

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

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
}

여기에 이미지 설명 입력


답변

AutoLayout을 사용하는 경우UILabel 구성 UI로만 높이를 조정할 수 있습니다 .

iOS8 이상

  • 제약 조건 선행 / 후행 설정 UILabel
  • 그리고 줄을 UILabel1에서 0으로 변경하십시오.

여기에 이미지 설명 입력

iOS7의 경우

  • 먼저 , 포함 높이를 추가해야합니다.UILabel
  • 그런 다음 Relation from Equalto toGreater than or Equal

여기에 이미지 설명 입력

  • 마지막으로 행을 UILabel1에서 0 으로 변경합니다.

여기에 이미지 설명 입력

당신의 UILabel의지는 자동으로 텍스트에 따라 높이를 증가


답변

원하는 경우이 확장 프로그램을 만듭니다.

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


답변

강력한 작업 솔루션이 있습니다.

layoutSubviews에서 :

    _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.
물론이 UILabel 설정으로 :

    _title.lineBreakMode = .ByWordWrapping
    _title.numberOfLines = 0


답변

설정하기 만하면 :

label.numberOfLines = 0

레이블은 입력 한 텍스트 양에 따라 높이를 자동으로 조정합니다.


답변

Anorak의 답변에 따라 Zorayr의 우려에도 동의하므로 UILabel을 제거하고 CGFloat 만 반환하는 두 줄을 추가했습니다. 원래 코드가 UIabel을 추가하지 않았기 때문에 도움이되는지 모르겠지만 오류가 발생하지 않으므로 아래 코드를 사용하고 있습니다.

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
}


답변

신속한 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)