텍스트에 맞게 높이를 조정하려는 레이블이 있습니다. 이것이 제가 지금 작성한 코드입니다.
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
- 그리고 줄을
UILabel
1에서 0으로 변경하십시오.
iOS7의 경우
- 먼저 , 포함 높이를 추가해야합니다.
UILabel
- 그런 다음 Relation from
Equal
to toGreater than or Equal
- 마지막으로 행을
UILabel
1에서 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)
