[iOS]Auto Layoutの使い方

storyboard上に適当にボタンを配置。

4inch(iPhone5)から、3.5inch(iPhone4Sまで)に変更すると

スクリーンショット 2013-08-17 22.04.24

重なっている!

という、かなしいことがあったので、Auto Layoutの基本を調べてみた。

Storyboard上でのAuto Layoutの使い方

ボタンを配置する。そのボタンを選択してSize inspectorを開いてみる。

スクリーンショット 2013-08-18 0.49.51

Constraintsの部分で、位置と大きさがどのように指定されているか分かる。

leading

Leading Space to:Superview が、親viewの左端までの間隔。

top

Top Space to:Superview が、親viewの上端までの間隔。

これで、ボタンの位置が決まる。でも、これだけじゃボタンのサイズが定まらないんでは?と思った。
実は、ボタンやラベルは、Size to Fit Content というのになってて内容にあわせて伸縮するようになっている。

Size to Fit Contentをやめてみる。
ボタンの隅をドラッグで引っ張るもしくは、数値指定をしてサイズを変更すると、widthとheightを指定したモードになって、ConstraintsにWidthとHeightが加わる。

スクリーンショット 2013-08-18 15.12.06

Size to Fit Contentに戻すには。Editor –> Size to Fit Content。
sizeToFitContentスクリーンショット 2013-08-18 17.33.28

Constraintsってどんな風にあつかうのか、みていこう。
ボタンを配置してこんな感じにサイズを変更したとこから。

スクリーンショット 2013-08-18 19.57.50
紫色のアイコンになっているConstraintは、削除できない。必須のConstraint。配置するために最低限必要なConstraint。
スクリーンショット 2013-08-18 19.58.55

いま、左端からの間隔、上端からの間隔、ボタンの幅、ボタンの高さでもって、配置をしている状況。
iOSシミュレータで横向き(Landscape)で見てみる。
(ハードウェア –>時計回りに回転、反時計回りに回転 で向きを変えることが出来る)

iosシミュレータ
landscapeSS
左端からの間隔、上端からの間隔、ボタンの幅、ボタンの高さは、保たれている。

独自にConstraintを加えてみる。
ボタンの幅は可変にして、右端からの間隔を固定することにしてみる。
Editor –> Pin –> Trailing Space to Superview を選択する。

trail

すると、Constraintsに Trailing Space to Superview が加わる。

スクリーンショット 2013-08-18 22.16.25 のコピー
(leading、trailingについて。

属性leadingおよびtrailingは、英語の場合はleftおよびrightと同じ意味ですが、ヘブライ 語、アラビア語など、右から左へ文を書く環境では、UIが左右反転します。

Cocoa Auto Layoutガイドより)

また、Constraintsの一部が、青色アイコンに変わっているのが分かる。青色アイコンのConstraintは削除できる。
今回は、ボタン幅は可変にしたいので、ConstraintsのWidth指定を削除する。

Constraints_deleteWidth

すると、縦向き(portrait)ではボタンの配置は変わらないが、横向き(landscape)でボタンの幅がのびている。
左端からの間隔、上端からの間隔、右端からの間隔、ボタンの高さによって配置されていることがわかる。

portrait_and_landscape

UIオブジェクトと親viewとのConstraintをすこしみてみた。
つぎに兄弟間のUIオブジェクトでのConstraintをみてみよう。

Align。

ボタンなど、いくつか配置。(今回は、Label, Button, Segmented Controlを配置した。ラベルのBackgroundに着色してみた)

スクリーンショット 2013-08-19 18.24.44
ボタンのConstraintsは現在この状況。
スクリーンショット 2013-08-19 18.32.23
配置したUIオブジェクトを複数選択。(今回は3つとも選択)
Editor –> Align –> Left Edges。
leftedge
これで、左端が揃う。
スクリーンショット 2013-08-19 18.26.13
ボタンのConstraintでは、Leading Space to Superviewがなくなって、Align Leading to Segmented Controlが加わっている。
スクリーンショット 2013-08-19 18.38.03

このように、複数のUIオブジェクトを選択して、Editor –> Align から、「整列」ができる。左揃え、右揃え、上端揃え、下端揃え、中央揃え(水平方向、垂直方向)、ベースライン揃え、コンテナ中央揃え(水平方向、垂直方向)。
こちらのアイコンから開くことも出来る。

スクリーンショット 2013-08-19 20.57.12

次にpin。
ボタンをいくつか配置。4inch画面で配置して、3.5inch画面にするとボタンが重なってしまった配置。

スクリーンショット 2013-08-19 21.54.30
ボタンAのConstraintsを見てみる。
スクリーンショット 2013-08-19 22.03.46

「Top Space to:Superview 親viewの上端からの間隔」と「Align Leading to:Button-ButtonB ボタンBとの左端の位置揃え」がある。
画面の大きさが変わってもボタンの位置関係が保たれるようにしたい。ボタンと親viewとの間隔調整でも出来るけれども、今回はボタン間の間隔を固定することにしよう。
ボタンAとボタンBを選択。
Editor –> Pin –> Vertical Spacing。

verticalSpacing
ボタンAのConstraintsはこんなふうになる。
スクリーンショット 2013-08-19 23.25.40
このままだと、3.5inch画面では、さきほどと違う重なり方で、ボタンが重なっている。
スクリーンショット 2013-08-19 23.32.51

ボタンBとボタンCを選択。
Editor –> Pin –> Vertical Spacing。

BandCverticalSpacing
ボタンCのConstraintsに、「Top Space to:Button-ButtonB」が加わる。
スクリーンショット 2013-08-20 0.38.30
ボタンCのConstraintsから「Bottom Space to:Superview」を削除。
deleteBottomSpaceConstraint
これで、3.5inch画面でも、ボタンの位置関係が保たれるようになった。
スクリーンショット 2013-08-20 0.52.16

Editor –> Pin。UIオブジェクトの幅、高さの固定。UIオブジェクト間の間隔(水平方向、垂直方向)。UIオブジェクトと親viewの端からの間隔。UIオブジェクト間で幅揃え、高さ揃え。
こちらのアイコンから開くことも出来る。

スクリーンショット 2013-08-20 1.12.00

参考
Cocoa Auto Layoutガイド(pdf) Constraintsには不等式や優先度を用いることもできることや視覚的書式言語で記述できることなど、紹介されている。
Cocoa Auto Layout Guide: About Cocoa Auto Layout
Auto Layoutチュートリアル その1 – Cyber Passion for iOS その8まである詳しいチュートリアル。

投稿者:

nackpan

nackpan

iOSアプリを作っています。
リピーティングに便利な「語学学習支援プレイヤー」つくりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です