web-dev-qa-db-ja.com

サブビューに合わせてUIViewサイズを設定します


動的な高さを持つ2つのUILabelを含むUIViewを持っています。 UIViewをUILabelsのサイズ+パディングに合わせたい。現在、ラベルを描画してから、UIViewの幅と高さの制約をラベルの合計サイズに設定しています。

今、私はこれをやっています:

func populateWithMessage(headline: String?, message: String) {
    // Sets text
    self.headerLabel.text = headline
    self.messageLabel.text = message

    self.headerLabel.sizeToFit()
    self.messageLabel.sizeToFit()

    self.layoutSubviews()

    // Finding the label with the greatest width
    var longestLabel: UILabel!
    if self.headerLabel.frame.width > self.messageLabel.frame.width {
       longestLabel = self.headerLabel
   } else {
       longestLabel = self.messageLabel
   }

   let combinedLabelHeight = self.headerLabel.frame.height + self.messageLabel.frame.height

   // Update the container view's constraints
   self.containerViewWidtConstraint.constant = longestLabel.frame.width + 10
   self.containerViewHeightConstraint.constant = combinedLabelHeight + 10

   self.updateConstraints()
}

残念ながら機能しません:-/

どんなアイデアでも大歓迎です!

私はSwift 2.3およびAutolayout。

14
Nikolaj Nielsen

ストーリーボード自体を使用して実行できます。

ビューの下部の制約を2番目のUIlabelに設定します。したがって、ラベルの高さが増加すると、UIViewの高さも増加します。

enter image description here

enter image description here

27
miOS

@Girish Mの答えは正しいです。明確にするだけです。上部ラベルの制約をビューの上部、2つのラベル間の垂直間隔、下部ラベルとUIView間の下部制約に設定します。高さの制約を設定しないでください。

または、UILabelsの高さをもう少し制御したい場合は、ラベルのストーリーボードに高さの制約を追加し、コードでそれらのアウトレットを作成できます。ラベルのテキストを変更するときにこのコードを実行します。

    label1.sizeToFit()
    label2.sizeToFit()

    label1HeightConstraint.constant = label1.frame.size.height
    label2HeightConstraint.constant = label2.frame.size.height

    view.layoutSubviews()
4
Carien van Zyl