プログラムでUIViewの一定の高さ制約を更新する方法は?


102

私が持っているUIViewと私はXcodeのインタフェースBuilderを使用して制約を設定します。

次に、プログラムでそのUIView's高さ定数を更新する必要があります。

のような機能がありますが、myUIView.updateConstraints()使い方がわかりません。


高さ制約の出口を
取得し、

このリンクまたはこのリンクを参照に使用できます。
Amna Farhan 2017年

これは、単一または複数の制約を更新する方法です。stackoverflow.com/a/54171693/8861442
Sarath Kumar Rajendran

回答:


216

Interface Builderから高さ制約を選択し、そのアウトレットを取得します。したがって、ビューの高さを変更したい場合は、以下のコードを使用できます。

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

メソッドupdateConstraints()はのインスタンスメソッドですUIView。プログラムで制約を設定する場合に役立ちます。ビューの制約を更新します。詳細については、ここをクリックしてください


58
今日、Constraintsをアウトレットに変えることができることを学び、そこから自分がやりたいことは何でもできるようになりました。ありがとう
Chris Mikkelsen 2017年

@ParthAdroja、仲間、私の質問stackoverflow.com/questions/46034278/…を見てください 。
May Phyu

xibファイルがありません。UIViewでyourHeightConstraintをプログラムで設定する方法を教えてください。
ニュースツァー2018年


定数制約の変更後、layoutIfNeededを呼び出す必要があると聞きました どうして?そして、viewWillLayoutSubviewsとviewDidLayoutSubviews内でlayoutIfNeededを呼び出すこともあります。大丈夫ですか?
ニーモニック

104

複数の制約のあるビューがある場合、複数のアウトレットを作成する必要がないはるかに簡単な方法は次のとおりです。

インターフェイスビルダーで、識別子を変更する各制約を指定します。

ここに画像の説明を入力してください

次に、コードで次のように複数の制約を変更できます。

for constraint in self.view.constraints {
    if constraint.identifier == "myConstraint" {
       constraint.constant = 50
    }
}
myView.layoutIfNeeded()

複数の制約に同じ識別子を付けることができるため、制約をグループ化して、一度にすべて変更できます。


これはうまく機能しますが、通常のアウトレットコレクションを使用して制約をグループ化する方が簡単だと思います。たとえば、私が作業しているビューでは47の制約がありますが、実行時に変更したい制約は6つだけなので、はるかに小さなループになります。これは、2つの異なる場所間で文字列を同期させる必要もありません。
Gary Z

1
このヒントをありがとうジョージ。それは私が遊んでいるいくつかの現在のレイアウトの本当の助けです。
ジムヒルハウス

1
美しい
ウィリアムヤン

こんにちは、私は同じ方法で使用していますが、ifケースでは使用されず、同じ識別子を指定しています。
Rob13、18年

制約に名前を付けることが可能かどうか疑問に思っていました。正解です。
ShadeToD

35

変更しHeightConstraintWidthConstraint作成せずにIBOutlet

注:ストーリーボードまたはXIBファイルで高さまたは幅の制約を割り当てます。この拡張機能を使用してこの制約をフェッチした後。

この拡張機能を使用して、高さと幅の制​​約を取得できます。

extension UIView {

var heightConstraint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .height && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

var widthConstraint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .width && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

}

以下を使用できます。

yourView.heightConstraint?.constant = newValue 

2
+のfirst(where: ...)代わりにすぐに使用できる方法がありますfilterfirst
Vyachaslav Gerchicov '15

13

制約をIBOutletとしてVCにドラッグします。次に、関連する値(およびその他のプロパティ。ドキュメントを確認)を変更できます。

@IBOutlet myConstraint : NSLayoutConstraint!
@IBOutlet myView : UIView!

func updateConstraints() {
    // You should handle UI updates on the main queue, whenever possible
    DispatchQueue.main.async {
        self.myConstraint.constant = 10
        self.myView.layoutIfNeeded()
    }
}

9

必要に応じて、スムーズなアニメーションで制約を更新できます。以下のコードのチャンクを参照してください。

heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})

4

上記の方法が機能しない場合は、必ずDispatch.main.async {}ブロックで更新してください。その後、layoutIfNeeded()メソッドを呼び出す必要はありません。


4

まず、以下のコードのようにIBOutletを作成するために、高さ制約をビューコントローラーに接続します

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

次に、以下のコードをビューにロードしたか、アクション内に配置します

self.select_dateHeight.constant = 0 // we can change the height value

ボタンをクリックした場合

@IBAction func Feedback_button(_ sender: Any) {
 self.select_dateHeight.constant = 0

}

1

レイアウト制約を更新するには、定数プロパティを更新して、後でlayoutIfNeededを呼び出すだけです。

myConstraint.constant = newValue
myView.layoutIfNeeded()

1
Create an IBOutlet of NSLayoutConstraint of yourView and update the constant value accordingly the condition specifies.

//Connect them from Interface 
@IBOutlet viewHeight: NSLayoutConstraint! 
@IBOutlet view: UIView!

private func updateViewHeight(height:Int){
   guard let aView = view, aViewHeight = viewHeight else{
      return
   }
   aViewHeight.constant = height
   aView.layoutIfNeeded()
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.