40884


XcodeのAutoLayoutでスライドバーの制約(constraint)を以下のように設定しています。  
[![画像の説明をここに入力](https://i.stack.imgur.com/uY3KG.png)](https://i.stack.imgur.com/uY3KG.png)

コードでスライドバーの制約を後から変更したいと思っています。（画面縦方向、横方向に向けた場合）  
スライドバーの下からの距離を60から300に変更したいと思っています。

[code]

    @IBOutlet weak var seekBar: UISlider!
    ・・・
    seekBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 300).isActive = true
    
[/code]

と設定しても画面上変わりません。  
もしくは

[code]

    seekBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 300)
    
[/code]

としても同様です。

・そもそも命令が違う  
・AutoLayoutが効くタイミングはいつもではなく、あるタイミング（起動時のみなど）に限られている  
・制限の概念を勘違いしている

など想像していますが、何が原因で変更できないのかわかりません。  
ご存知の方、ご教示お願いします。


CC BY-SA 3.0
2018-01-11T03:00:13.597
40876
2018-01-11T08:36:04.840
8593
question
swift
swiftでコードからAuto Layoutの制約を変える方法

[code]

    seekBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: 300).isActive = true
    
[/code]

は、seekBarに新しい制約を作成して、その値を300に設定するコードになります。  
Storyboardで設定した古い制約はまだ有効のままなので、二つの制約が矛盾した状態になってしまいます。おそらく矛盾を解消するために後から設定した制約が無視されているのでしょう。  
（ログに制約がコンフリクトしていることが表示されていませんか？）

Storyboardで設定した制約の値を変更したい場合は、変更したい制約をViewControllerなどにOutletで接続してプロパティで保持し、必要なタイミングで値の変更と、`layoutIfNeeded()`の呼び出しを行うのが良いでしょう。

[code]

    @IBOutlet weak var seekBar: UISlider!
    @IBOutlet weak var bottomConstaint: NSLayoutConstraint!
    ...
    func someMethod() {
        // 制約の値を変更する
        bottomConstaint.constant = 300
        // 新しい制約の値でレイアウトする
        view.layoutIfNeeded()
    }
    
[/code]


CC BY-SA 3.0
2018-01-11T08:36:04.840
40884
2018-01-11T08:36:04.840
23829
40876
answer