2017-05-23 16 views
0

Swiftアプリケーションでは、AutoLayout制約を複数回更新する必要があるため、これを行う関数があります。私は時々更新されないこの制約の問題を抱えています。関数が呼び出されたときに最初に更新されるという問題に絞っていますが、その関数が再び呼び出された場合は問題になりません。制約を複数回更新する

関数からのコードは次のようになります。

let verticalSpace = NSLayoutConstraint(item: self.prompt, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1, constant: 10) 
NSLayoutConstraint.activate([verticalSpace]) 

誰もがこれを引き起こしている可能性が何を知っていますか?関数を何度も更新するために何か必要なことはありますか?

+1

実際の要件は何ですか?トップ制約値を10から他のものに更新するだけですか? –

答えて

1

あなたは "競合" 制約を持つことはできません。 verticalSpaceを10に設定した場合、別の verticalSpaceに設定すると、どの制約を使用する必要がありますか?

あなたがする必要があるのはです。既存の制約を削除(または無効化)し、新しい制約を追加/アクティブ化します。

それとも...

あなたはそれを変更したいときに望むしかし、あなたは.constantを変更することができます...あなたのverticalConstraintを作成し、それへの参照を保存します。

+0

ああ、私は矛盾する制約を考えていませんでした。 2番目のオプションは完全に機能しました。ありがとう! – Toby

0

はこれを試してみてください:

let verticalSpace = NSLayoutConstraint(item: self.prompt, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1, constant: 10) 
NSLayoutConstraint.activate([verticalSpace]) 
view.layoutIfNeeded() 
+0

ありがとうございますが、私はまだ最初に更新される箇所と同じ問題を抱えていますが、その後は更新されません。 – Toby

+0

@Tobyこれの結果はどうなりますか?制約を設定しているオブジェクトがアニメーションを開始するのか、それとも何か?通常、制約は一度更新する必要があります。 –

0

編集: 私はこれを次のルールで達成しました。

どちらか

ステップ1:

更新したいという制約を取り除きます。

ステップ2:

再び制約を追加します。

または

更新制約値。

どちらの場合も、更新する制約の参照が必要です。どのように

は、私はちょうど私のデモを追加したがcode.Iは、プログラムのビューを追加し、そしてそれは、コードを通過click.Justボタンで垂直制約を変更したのです。

件までviewDidLoadメソッド:

import UIKit 
class ViewController: UIViewController { 

    let someView = UIView() 
    var topValue:CGFloat = 10 
    var verticalConstraint:NSLayoutConstraint! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     //This below codes are used to add a red color UIView in center which has width and height both 100 
     someView.backgroundColor = UIColor.red 
     someView.translatesAutoresizingMaskIntoConstraints = false 
     self.view.addSubview(someView) 
     let horizontalConstraint = NSLayoutConstraint(item: someView, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0) //Center horizontally 
     verticalConstraint = NSLayoutConstraint(item: someView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.top, multiplier: 1, constant: topValue) // center vertically.want to change that constraint later so took a variable. 
     let widthConstraint = NSLayoutConstraint(item: someView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100) //width 100 
     let heightConstraint = NSLayoutConstraint(item: someView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100) //height 100 
     view.addConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint]) 

    } 

そして、各ボタンのtopConstantが徐々に更新されますクリックしてください。

これはのコードです。私が言及した部分です。

self.view.removeConstraint(verticalConstraint) 
verticalConstraint = NSLayoutConstraint(item: someView, attribute: 
NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: 
view, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 
topValue) 
self.view.addConstraint(verticalConstraint) 

そして、これがまたは一部のコードです。

verticalConstraint.constant = topValue 

そして、私のbuttonClickイベントメソッドは、基本的にこれに似ています。

@IBAction func updateView(_ sender: Any) { 
    topValue += 10 
    //In this case I've removed the previous constraint and add that constraint again with new Value 
    self.view.removeConstraint(verticalConstraint) 
    verticalConstraint = NSLayoutConstraint(item: someView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.top, multiplier: 1, constant: topValue) 
    self.view.addConstraint(verticalConstraint) 

    //In this case I've just update that constraint value.Commented because we are using first method 
    //verticalConstraint.constant = topValue 

} 

私の出力。 enter image description here

関連する問題