高さをテキストに合わせて調整したいラベルがいくつかあります。これは私が今このために書いたコードです。
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)
Swift 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
}
あなたが望むなら私はこの拡張子を作成します
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()
PD。このUILabel設定ではもちろん:
_title.lineBreakMode = .ByWordWrapping
_title.numberOfLines = 0
設定するだけで:
label.numberOfLines = 0
ラベルは入力されたテキストの量に基づいて自動的に高さを調整します。
anorakの答えに基づいて、私はZorayrの懸念にも同意するので、UILabelを削除してCGFloatのみを返すために数行を追加しました。エラーが発生しないので、以下のコードを使用します。
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
}
Swift 4.1とXcode 9.4.1の場合
のみステップ
ステップ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)
Anorakが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の回答に続いて、私はこの拡張をStringに追加し、パラメータとしてインセットを送信しました。なぜなら、あなたはあなたのテキストにパディングが必要になるでしょう。とにかく、多分あなたはこの便利を見つけるでしょう。
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でテキストの高さを計算する方法です。四角形から高さを取得して、ラベルや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)
Swift 4.0
self.messageLabel = UILabel(フレーム:CGRect(x:70、y:60、幅:UIScreen.main.bounds.width - 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()
Blockquote NSParagraphStyle.LineBreakMode、段落内の単語ではなく段落全体に適用されます。このプロパティは、通常の描画中およびラベルのテキストを境界ボックス内に収めるためにフォントサイズを小さくする必要がある場合の両方で有効です。このプロパティは、デフォルトでbyTruncatingTailに設定されています。
ラベルに動的なHeightが必要な場合は、このメソッドを呼び出すだけです。
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
}
ラベルの高さを計算するための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
}
}
Swift 4.
テキスト/ラベルの高さを計算する代わりに、(動的な)テキストを挿入した後にラベルのサイズを変更します。
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でラベルを動的にするには、高さconstarintを与えず、ストーリーボードで行番号0のラベルに下制約を与えます。これは、コンテンツサイズごとに動的ラベルを処理する最良の方法です。