2017-09-27 26 views
0

私はスタック内の2つのラベルと行を含む単純なクラスがあります。sizeThatFitsがUILabelで動作しないのはなぜですか?

class TestView: UIView 
{ 
    let label_A  = UILabel() 
    let label_B  = UILabel() 

    override init(frame: CGRect)   { super.init(frame: frame);  setup() } 
    required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder); setup() } 
    func setup() 
    { 
     let view_BG  = UIView() 
     let view_LineH = UIView() 

     // Configure 
     view_BG.backgroundColor = .white 
     view_BG.layer.cornerRadius = 6 

     view_LineH.backgroundColor = .gray 

     label_A.numberOfLines = 0 
     label_A.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0.2) 
     label_A.textColor = .red 
     label_B.numberOfLines = 0 
     label_B.textColor = .blue 
     label_B.backgroundColor = UIColor(red: 0, green: 0, blue: 1, alpha: 0.2) 

     label_A.text = "TestA" 
     label_B.text = "Experiment with Swift standard library types and learn high-level concepts using visualizations and practical examples. Learn how the Swift standard library uses protocols and generics to express powerful constraints. Download the playground below to get started." 

     // Assemble 
     self.addSubview(view_BG) 
     view_BG.addSubview(label_A) 
     view_BG.addSubview(view_LineH) 
     view_BG.addSubview(label_B) 

     // Layout 
     view_BG.constrain_edges(to: self) 
     label_A.constrain_edges(to: view_BG, excludingEdge: .bottom) 
     label_B.constrain_edges(to: view_BG, excludingEdge: .top) 

     view_LineH.constrain_height(1) 
     view_LineH.constrain_left(to: view_BG) 
     view_LineH.constrain_right(to: view_BG) 
     view_LineH.constrain_topToBottom(of: label_A) 
     label_B.constrain_topToBottom(of: view_LineH) 
    } 
} 

私はsizeThatFitsを呼び出すと、それは私だけで背中の高さを吐く:

let v = TestView() 
let s = v.sizeThatFits(CGSize(width: 200, height: 10000)) 
// s is (200, 10000) 

どのように計算することができますが指定された幅を持つ所望の高さ?

+0

それが作りますそれがあなたに戻ってくると感じます。 'TestView'のあなたのすべての制約は、すべて端に制約されます。しかし、あなたは 'TestView'のフレームをまだ設定していません。だから、内部のすべての不明なフレームサイズが与えられているどのようにそれらのすべてを含む正しいフレームサイズを決定することができますか?できません。 – TNguyen

+0

次に、sizeThatFitsに* width *とa * height *を指定するポイントは何ですか?私が1つだけを指定していた場合は、あいまいです。 sizeThatFitsを呼び出す前に、v.frame = CGRect(x:0、y:0、width:columnWidth、height:100)のようなものを追加しても結果は同じです。 – GoldenJoe

答えて

0

私はあなたが.systemLayoutSizeFitting()をしたいと考えている:

let tv = TestView() 

    let targSize = CGSize(width: 200, height: 10000) 

    let fitSize = tv.systemLayoutSizeFitting(targSize, withHorizontalFittingPriority: 1000, verticalFittingPriority: 1) 

    print(fitSize) 

    // prints "(200.0, 245.0)" in my playground 

私はあなたが.constrain_edgesものに使用しているものは何でも持っているので、ここで私が実行している実際のビュークラスではありません。

class TestView: UIView 
{ 
    let label_A  = UILabel() 
    let label_B  = UILabel() 

    override init(frame: CGRect)   { super.init(frame: frame);  setup() } 
    required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder); setup() } 
    func setup() 
    { 
     let view_BG  = UIView() 
     let view_LineH = UIView() 

     // Configure 
     view_BG.backgroundColor = .white 
     view_BG.layer.cornerRadius = 6 

     view_LineH.backgroundColor = .gray 

     label_A.numberOfLines = 0 
     label_A.backgroundColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0.2) 
     label_A.textColor = .red 
     label_B.numberOfLines = 0 
     label_B.textColor = .blue 
     label_B.backgroundColor = UIColor(red: 0, green: 0, blue: 1, alpha: 0.2) 

     label_A.text = "TestA" 
     label_B.text = "Experiment with Swift standard library types and learn high-level concepts using visualizations and practical examples. Learn how the Swift standard library uses protocols and generics to express powerful constraints. Download the playground below to get started." 

     // Assemble 
     self.addSubview(view_BG) 
     view_BG.addSubview(label_A) 
     view_BG.addSubview(view_LineH) 
     view_BG.addSubview(label_B) 

     view_BG.translatesAutoresizingMaskIntoConstraints = false 
     label_A.translatesAutoresizingMaskIntoConstraints = false 
     label_B.translatesAutoresizingMaskIntoConstraints = false 
     view_LineH.translatesAutoresizingMaskIntoConstraints = false 

     // Layout 
     view_BG.topAnchor.constraint(equalTo: self.topAnchor, constant: 0.0).isActive = true 
     view_BG.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0.0).isActive = true 
     view_BG.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0.0).isActive = true 
     view_BG.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0.0).isActive = true 


     label_A.topAnchor.constraint(equalTo: view_BG.topAnchor, constant: 0.0).isActive = true 
     label_A.leftAnchor.constraint(equalTo: view_BG.leftAnchor, constant: 0.0).isActive = true 
     label_A.rightAnchor.constraint(equalTo: view_BG.rightAnchor, constant: 0.0).isActive = true 

     label_B.leftAnchor.constraint(equalTo: view_BG.leftAnchor, constant: 0.0).isActive = true 
     label_B.rightAnchor.constraint(equalTo: view_BG.rightAnchor, constant: 0.0).isActive = true 
     label_B.bottomAnchor.constraint(equalTo: view_BG.bottomAnchor, constant: 0.0).isActive = true 

     view_LineH.leftAnchor.constraint(equalTo: view_BG.leftAnchor, constant: 0.0).isActive = true 
     view_LineH.rightAnchor.constraint(equalTo: view_BG.rightAnchor, constant: 0.0).isActive = true 

     view_LineH.topAnchor.constraint(equalTo: label_A.bottomAnchor, constant: 0.0).isActive = true 
     label_B.topAnchor.constraint(equalTo: view_LineH.bottomAnchor, constant: 0.0).isActive = true 

     view_LineH.heightAnchor.constraint(equalToConstant: 1.0).isActive = true 

    } 
} 
+0

それは奇妙です、それは私に(0,285.5)を与えています。コンパイルするには、次のパラメータを設定しなければなりませんでした。 let fitSize = c.systemLayoutSizeFitting(targetSize、withHorizo​​ntalFittingPriority:.required、verticalFittingPriority:.defaultLow) – GoldenJoe

+0

私は制約に関係があるかどうかはわかりませんが、クラス私はこれをテストするために走っています。 – DonMag

+0

ええと....おそらくバージョン違い?私はこれをXcode 8.2.1の遊び場で実行しています。 Xcode 9/Swift 4を使用している場合、それは重要です。 – DonMag

関連する問題