私はUIView
を持っていて、Xcode Interface Builderを使って制約を設定します。
今度はそのUIView's
の高さ定数をプログラムで更新する必要があります。
myUIView.updateConstraints()
のような機能がありますが、使い方がわかりません。
Interface Builderから高さの拘束を選択して、その出口を選択します。そのため、ビューの高さを変更したい場合は、以下のコードを使用できます。
yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()
メソッドupdateConstraints()
はUIView
のインスタンスメソッドです。プログラムで制約を設定しているときに役立ちます。ビューの制約を更新します。詳細については、 をクリックしてください 。
複数の制約を持つビューがある場合、複数のアウトレットを作成しなくてもはるかに簡単な方法は次のようになります。
インターフェイスビルダーで、識別子を変更したい各制約を与えます。
それからコードであなたはそのように複数の制約を修正することができます:
for constraint in self.view.constraints {
if constraint.identifier == "myConstraint" {
constraint.constant = 50
}
}
myView.layoutIfNeeded()
複数の制約に同じ識別子を指定することで、制約をまとめてまとめて変更することができます。
HeightConstraint
を作成せずにWidthConstraint
とIBOutlet
を変更します。
注:ストーリーボードまたはXIBファイルで高さまたは幅の制限を割り当てます。この拡張子を使ってこのConstraintを取得した後。
この拡張を使って高さと幅を取得することができます。
extension UIView {
var heightConstaint: NSLayoutConstraint? {
get {
return constraints.first(where: {
$0.firstAttribute == .height && $0.relation == .equal
})
}
set { setNeedsLayout() }
}
var widthConstaint: NSLayoutConstraint? {
get {
return constraints.first(where: {
$0.firstAttribute == .width && $0.relation == .equal
})
}
set { setNeedsLayout() }
}
}
あなたが使用することができます
yourView.heightConstaint?.constant = newValue
制約をIBOutletとしてVCにドラッグします。それからあなたはそれに関連する値(そして他のプロパティ。ドキュメントをチェックする)を変更することができます。
@IBOutlet myConstraint : NSLayoutConstraint!
@IBOutlet myView : UIView!
func updateConstraints() {
// You should handle UI updates on the main queue, whenever possible
DispatchQueue.main.async {
myConstraint.constant = 10
myView.layoutIfNeeded()
}
}
以下のコードのようにIBOutletを作成するために、まずHeight拘束をビューコントローラに接続します。
@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
}
必要に応じて、スムーズなアニメーションで制約を更新することができます。以下のコードの塊をご覧ください。
heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})
上記の方法でうまくいかない場合は、Dispatch.main.async {}ブロックで必ず更新してください。そのときにlayoutIfNeeded()メソッドを呼び出す必要はありません。
レイアウト制約を更新するには、定数プロパティを更新し、あとでlayoutIfNeededを呼び出すだけです。
myConstraint.constant = newValue
myView.layoutIfNeeded()
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()
}