質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Q&A

解決済

2回答

6417閲覧

制約を動的に変更したい

interpiamobile

総合スコア66

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

0グッド

1クリップ

投稿2016/02/29 02:34

コードから制約を動的に変更したくて色々とやっているのですが、うまくいきません。
スイッチを押すとImageViewをずらすということをやりたくて、ImageViewがずれると他のViewも一緒にずらしたいので、スイッチを押すと制約をまず以下のように変更しています。

スイッチON

Objective

1[self.myImageView.leadingAnchor constraintEqualToAnchor: self.layoutMarginsGuide.leadingAnchor constant: 73.0].active = true;

そしてもう一度スイッチが押されてOFFになると以下のようにしてImageViewを元の位置に戻そうとしています。

スイッチOFF

Objective

1[self.myImageView.leadingAnchor constraintEqualToAnchor: self.layoutMarginsGuide.leadingAnchor constant: 12.0].active = true;

実際上記のコードを実行してみてもImageViewの位置は変わりません。
しかし以下のようにleadingAnchorをleftAnchorに変えると一回目にスイッチをONにした時だけImageViewが動きました。

Objective

1[self.myImageView.leftAnchor constraintEqualToAnchor: self.layoutMarginsGuide.leftAnchor constant: 73.0].active = true;

なぜ一番最初にスイッチを切り替えた時にしか制約の変更ができないのでしょうか?
そもそもleadingAnchorとleftAnchorの違いは何なのでしょうか?
どなたかわかる方がいれば教えていただきたいです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

constraintEqualToAnchor

constraintEqualToAnchorは、制約を追加するようで、例えば、

objectivec

1[self.myImageView.widthAnchor constraintEqualToConstant:100].active = YES; 2[self.myImageView.widthAnchor constraintEqualToConstant:120].active = YES;

こうすると、後ろの制約(width=120)だけが有効になるのではなく、両方の制約が設定されてしまいエラー(Unable to simultaneously satisfy constraints.)になります。

以上を踏まえて、追加した制約を保存しておき、スイッチON/OFFで制約の値(constant)を変更するようにします。

objectivec

1//保存用の変数を用意 2NSLayoutConstraint *constraintLeading; 3 4//初期化 5constraintLeading = [self.myImageView.leadingAnchor constraintEqualToAnchor:self.view.layoutMarginsGuide.leadingAnchor constant:12.0]; 6constraintLeading.active = YES; 7 8//スイッチON 9constraintLeading.constant = 73.0; 10 11//スイッチOFF 12constraintLeading.constant = 12.0; 13

leadingAnchorとleftAnchor

leadingAnchorとleftAnchorの違いは何なのでしょうか?

leadingは文頭、leftは左です。そのまんまですが。

今の日本では leading == left
昔の日本では leading == right

という風に、右から左に文章を書く言語では、leading != left になります。(実際に試してませんが)

投稿2016/02/29 02:58

編集2016/02/29 06:01
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

interpiamobile

2016/02/29 03:02

ご回答ありがとうございます。なるほど、文字を書き始める位置を柔軟に決めてくれるのがleadingなのですね。しかしそれだけが違いなのであればleadingAnchorからleftAnchorに変えた時に制約が効き出した理由がよく分かりません......。
fuzzball

2016/02/29 03:56

制約に関する具体的な記述が無いのでなんとも言えないのですが、leadingAnchorを変更することによって別の制約に矛盾が生じているというようなことはないでしょうか?
fuzzball

2016/02/29 05:32

無事に解決されたようですが、私も答えに辿り着けましたので回答に追記しておきます。
interpiamobile

2016/02/29 06:45

constraintEqualToAnchorの後にconstraintEqualToAnchorを設定すると上書きされるわけではないのですね!ご提示のコードを参考にコードを書き換えました。丁寧な解説ありがとうございました。
guest

0

自己解決

以下のページを参考にして解決できました。
How to change Auto Layout constraints after they are set when using constraintEqualToAnchor()?

まずグローバル変数で

Objective

1NSLayoutConstraint *leftConstraint;

と定義しておき、この変数を

Objective

1leftConstraint = [self.myImageView.leadingAnchor constraintEqualToAnchor: self.layoutMarginsGuide.leadingAnchor constant: 12.0];

といった感じで初期化して、あとはスイッチのオンオフで

Objective

1leftConstraint.active = true;

というようにleftConstraintのactiveをtrueかfalseに変えることでうまくいきました。

投稿2016/02/29 05:25

interpiamobile

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問