質問: ### Autolayoutでmarginを動的に変更したい 現在StoryboardのAutolayoutの勉強をしています。 Viewのサイズを動的(デバイスサイズに合わせて)に変更することは、DummyViewを設ける等で解決しました。しかし、各オブジェクトに対するマージンを同じ様に設定することが出来ず困っています。 %指定した透明なViewを設けてそれに対してmargin:0で指定、という方法も思いつきましたが、とても非効率な気がしています。何か良い方法はございませんでしょうか? *StackViewは未対応なverが多い様なのでなしでお願いします。 ### [追記] 修正依頼がありましたので画像をアップさせて頂きます。お見苦しいかもしれませんがご勘弁下さい。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/de29678cfa4f0f1902ae77d475b1b625.png) 今回マージンを設定したいのは画面左上のボタン(RMCalculator)と右上のボタン(NameButton)です。 現在の各設定は ・RMCalculator(左上ボタン) -上マージン:SuperView(View).top+30、 左マージン:SuperView.leading+10 -サイズ:縦横が DummyView*0.05 の正方形 ・NameButton(右上ボタン) -上マージン:RMCalculator.top+10、 右マージン:SuperView.trailing-10 -サイズ:未定義 *DummyViewのサイズはViewと同じ 理想の各設定 ・RMCalculator(左上ボタン) -上マージン:View.topからViewHeight*0.03下、 左マージン:View.leadingからView.Width*0.01右 -サイズ:設定済 ・NameButton(右上ボタン) -上マージン:RMCalculator.topからViewHeight*0.02下、右マージン:View.trailingからViewWidth*0.02左 -サイズ:文字数によって可変にするつもりだからまだ未定義 各オブジェクトの画像は現在作成中なので見た目は初期状態のままです。イメージしにくかったらごめんなさい。 上半分のオブジェクトに関しては配置が結構バラバラなので等間隔配置がしたい等の実装ではありません。 また、別問題になりますが書き方に引っかかる点などございましたらついでにご指摘頂けると幸いです。
回答: こんな感じかなぁ(僕もなんか思い違いしてるかもしれません、、、) 幅を位置に加算するにはスペーサーを置くしかないと思います。 !レイアウト (比率は小さかったので適当に大きくしています) 水色がDummyViewでその他のビューの親になっています。 1. RMCaluculatorSpacerを左上(0,0)に置いてLeading,TopのConstraintを作成 2. RMCaluculatorSpacerとDummyViewとでEqualWidth/EqualHeightを作成 3. 作成したEqualWidth/HeightのConstraintを選択して画面左のSize InspectorからMultiplierを5%なら5:100にする 4. RMCaluculatorのLeading, Top位置をとりあえずRMCaluculatorSpacerのLeading,TopとEqualにして作成 5. 作成したLeadingのConstraintを選択してSize InspectorからFirst ItemのRMCaluculator.LeadingをRMCaluculator.Trainingに変更(TopもBottomに変更) -> これでRMCaluculatorの(0,0)はSpacerの右下にくっつきます 6. RMCaluculatorとDummyViewとEqualWidth/Heightを作成して、Equal WidthのConstraintを選択、DummyView.WidthをHeightに変更、Width, HeightのMultiplierを設定します。 -> これでRMC〜はDummyViewのHeightから幅、高さ両方が決まります。 7. NameButtonSpacerのTopとRMCaluculatorのTop, Trainingと親ViewのTrainingを合わせます。 8. NameButtonSpacerのサイズを2,3と同様に設定し、NameButtonのTop, Trainingを4,5と同様に設定します。 ※ まずはある程度イメージする配置にしたほうが簡単です。 ※ 直近にないView1とView2間のConstraintを作成するにはView1からCommandを押しながらView2へラインを引いたらメニューが出てきます。 ※ Constraintの選択はビューを選択->Size InspectorのConstraintからLeadingなどの棒をクリック->出てきたConstraintをダブルクリックで素早く選択できます。 ※ Size InspectorのFirst, Secondが入れ替わっている場合はMultiplierを反対にするか、▼のReverse First and Second Itemで入れ替えられます。 ※ NameButtonのWidth、HeightはConstraintをわざと作成しなかったら中のコンテンツのサイズに自動調整されます。 うむ、手順を書いてみるとめんどくさいですね、、、 慣れたら1つ1つは簡単で数分の話なのですが、、、