2017-09-28 29 views
-1

私はSwiftでプログラムでラベルを作成しようとしていますが、問題はデータモデルに基づいてテキストの量が変わり、ラベルのサイズが変わることです。通常、私はテキストを知る前に、このようなラベルを作成します。動的にラベルサイズをプログラムで迅速に作成するにはどうすればよいですか?

headerLabel.frame = CGRect(x: 0, y: 0, width: screenSize.width/2.5, height: screenSize.height/45) 
headerLabel.center = CGPoint(x: screenSize.width/2, y: 245) 

しかし、この場合にテキストが行から段落までの任意の量は一生懸命高さは動作しませんコーディングすることができます。どんな量のテキストにも対応できるようにラベルを作成するには?

+0

行数を0に設定する – Shades

+0

これはプログラム的に行われていますが、どのようにフレームを設定できますか? – SwiftyJD

答えて

2

あなたは、文字列の高さと幅を計算し、それらを設定するには、次を使用することができます。

import Foundation 
import UIKit 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     let width = "Hello World".stringWidth // 74.6 
     let height = "Hello World".stringHeight // 16.7 

     let headerLabel = UILabel() 
     headerLabel.frame = CGRect(x: 0, y: 0, width: width, height: height) 
     headerLabel.center = CGPoint(x: screenSize.width/2, y: 245) 
    } 
} 

extension String { 
    var stringWidth: CGFloat { 
     let constraintRect = CGSize(width: UIScreen.main.bounds.width, height: .greatestFiniteMagnitude) 
     let boundingBox = self.trimmingCharacters(in: .whitespacesAndNewlines).boundingRect(with: constraintRect, options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 14)], context: nil) 
     return boundingBox.width 
    } 

    var stringHeight: CGFloat { 
     let constraintRect = CGSize(width: UIScreen.main.bounds.width, height: .greatestFiniteMagnitude) 
     let boundingBox = self.trimmingCharacters(in: .whitespacesAndNewlines).boundingRect(with: constraintRect, options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 14)], context: nil) 
     return boundingBox.height 
    } 
} 
0

このラベルは、定義された幅ではなく、定義された高さを有しています。高さは、ラベル内のテキストの量によって決まります。幅を削除した場合、ラベルは行に分割されません。これは必要なものではありません。最後に呼び出されるsizeToFit()メソッドは、ラベルのテキストに基づいて改行する必要があるテキストの行数を認識した後、ラベルの高さを設定します。これがあなたの望むものでない場合は、私に知らせてください。

let label = UILabel() 
label.text = "scones" 
label.numberOfLines = 0 // 0 = as many lines as the label needs 
label.frame.origin.x = 32 
label.frame.origin.y = 32 
label.frame.size.width = view.bounds.width - 64 
label.font = UIFont.displayHeavy(size: 17) // my UIFont extension 
label.textColor = UIColor.black 
label.sizeToFit() 
view.addSubview(label) 
0

ラベルに固有のプロパティにアクセスするには、テキストにラベルを付けてからフレームを渡すことができます。

スウィフト3:

let label = UILabel() 
label.text = "Your text here" 
label.textAlignment = .center 
label.font = UIFont.systemFont(ofSize: 14) 
label.frame = CGRect(x:0,y:0,width:label.intrinsicContentSize.width,height:label.intrinsicContentSize.width) 

あなたはintrinsicContentSizeに基づいていくつかの条件を確認することができます。

希望します。

関連する問題