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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

2985閲覧

[xcode]Autolayoutのmarginについて

morizoo-

総合スコア65

Objective-C

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/04/17 07:05

編集2016/04/18 01:54

###Autolayoutでmarginを動的に変更したい
現在StoryboardのAutolayoutの勉強をしています。

Viewのサイズを動的(デバイスサイズに合わせて)に変更することは、DummyViewを設ける等で解決しました。しかし、各オブジェクトに対するマージンを同じ様に設定することが出来ず困っています。
%指定した透明なViewを設けてそれに対してmargin:0で指定、という方法も思いつきましたが、とても非効率な気がしています。何か良い方法はございませんでしょうか?
*StackViewは未対応なverが多い様なのでなしでお願いします。

###[追記]
修正依頼がありましたので画像をアップさせて頂きます。お見苦しいかもしれませんがご勘弁下さい。
イメージ説明

今回マージンを設定したいのは画面左上のボタン(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からViewHeight0.03下、 左マージン:View.leadingからView.Width0.01右
-サイズ:設定済
・NameButton(右上ボタン)
-上マージン:RMCalculator.topからViewHeight0.02下、右マージン:View.trailingからViewWidth0.02左
-サイズ:文字数によって可変にするつもりだからまだ未定義

各オブジェクトの画像は現在作成中なので見た目は初期状態のままです。イメージしにくかったらごめんなさい。
上半分のオブジェクトに関しては配置が結構バラバラなので等間隔配置がしたい等の実装ではありません。
また、別問題になりますが書き方に引っかかる点などございましたらついでにご指摘頂けると幸いです。

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

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

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

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

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

toki_td

2016/04/17 15:50

どんな形にしたいのかいまいちよくわかりません。 画像などアップしてもらったほうがいいと思います。 ビューの間隔をデバイスのサイズによって変えたいということでしょうか?
fuzzball

2016/04/18 05:42

「サイズ:縦横が DummyView*0.05 の正方形」とありますが、正方形にはならないのでは?矩形ということでいいでしょうか?
morizoo-

2016/04/18 06:00

あ、すみません。間違えました。縦横がDummyView.height*0.05の正方形です。Viewの縦方向の長さだけを基準にしています。
fuzzball

2016/04/18 06:07

「DummyViewのサイズはViewと同じ」とのことですが、サイズの基準はdummyView、マージンの基準はViewにしているのには何か意味があるのでしょうか?
morizoo-

2016/04/18 06:12

深い意味はありません。やり始めのあまり理解出来ていない内に適当に付けてしまったものなので、後でDummyView基準に修正するつもりです。お目汚し失礼致しました。
guest

回答2

0

ベストアンサー

こんな感じかなぁ(僕もなんか思い違いしてるかもしれません、、、)
幅を位置に加算するにはスペーサーを置くしかないと思います。

レイアウト
(比率は小さかったので適当に大きくしています)

水色が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つは簡単で数分の話なのですが、、、

投稿2016/04/18 15:39

編集2016/04/18 15:45
toki_td

総合スコア2850

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

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

fuzzball

2016/04/18 23:46 編集

ちょっとしたことですが、 >>Multiplierを5%なら5:100にする これは「5%」のまま記述できます。「0.05」でもOKです。 その時々で分かり易い書き方をするのが良いですね。
morizoo-

2016/04/19 10:23

丁寧なご回答誠に有難うございます!! やはりStoryboard上で動的なマージンを作るには一工夫必要なのですね。 ご教授頂いたspacerを設ける手段だとどうしてもオブジェクトの数や制約が増えてしまい若干見づらくなってしまう印象を受けました。 ここで疑問に思ったのですが、無理にでもレイアウトをAutolayout内で統一してしまうか、楽できる所はコード上で済ませるかは、コードレビューのしやすさも含めた観点でどちらが好ましいのでしょうか?
toki_td

2016/04/19 15:25

> fuzzballさん あっ、そうなんですね、いつも比率で書いてたので気にしてませんでした、、、 勉強になります。 > morizoo-さん 無理に全部AutoLayoutにする必要はもちろんないです。 スペーサーなどがわかりにくいなら、わかりやすいとこだけAutoLayoutにするのも1つの手だと思います。 僕も今ではほとんどはAutoLayoutで作りますが微妙な調整が必要な時はコードで書きますよ。 ビュー内で中央揃えするだけなら明らかにAutoLayoutのほうが楽でわかりやすいです。 アプリの状態によって位置やサイズが変わるならAutoLayoutだけでは明らかに無理です。 要所要所で押さえておけばいいと思いますよ。
morizoo-

2016/04/20 06:54

成る程! たしかに状態遷移に対するレイアウトはAutolayoutだけじゃ無理ですね。。 制約が複雑化しない様ならspacerを設ける等、状況に応じて色々試してみようと思います! 大変参考になりました、ありがとうございました!
guest

0

私の場合の話ですが、マージンは固定でやってます。(それほど厳密なレイアウトにすることはないので)
もし、どうしてもやらないといけなくなったらコードで対応すると思います。

【追記】

ボタンより一回り大きいViewを用意してマージンにすれば、マージン用のダミーの数を減らせるかなと思ったのですが、基準となるサイズが縦横混在しているので断念しました。

例えば、RMCalculatorの縦方向について考えると、
上マージン(H * 0.03) + ボタン高(H * 0.05) + 下マージン(H * 0.03) = H * 0.11
というダミーViewを用意して、その上にボタンをセンター合わせします。

しかし、横方向は、
左マージン(W * 0.01) + ボタン幅(H * 0.05) + 右マージン(W * 0.01) = W * 0.02 + H * 0.05
と、縦横が混在しているので1つのConstraintで表現出来ません。

出来る方法があったら教えて下さいw

投稿2016/04/18 00:49

編集2016/04/18 06:30
fuzzball

総合スコア16731

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

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

morizoo-

2016/04/18 06:56

やはり%指定を直感的にやる方法は無いんですかね。。。 当面は僕もコード上で指定しようかな、と思います。 ご協力誠に有難うございました!!
morizoo-

2016/04/20 06:58

[追記に関して] 成る程、そのやり方は思いつきませんでした! 親子関係にすれば制約も分割できそうですね。 これから試してみようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問