xcodeでAutoLayoutでレスポンシブデザイン

xcode6になって
対応しなければならない画面サイズ（解像度の比率の種類）が５種類に増えました
（iPhone4S,iPhone5(S),iPhone6(S),iPhone6 Plus(S)、iPad）

デバイスの画面サイズの種類が増えたことで
StoryboardやxibでAutoLayoutを使わないやり方でやると
１つのレイアウトファイルではマルチデバイスのサイズに
対応ができなくなってしまっています

自分は今までAutoLayoutを使って来なかったので苦戦したので
他の困っている人向けに備忘録として残しておきます

XCode7以降でも基本的には同じです。

**長いです**

------------------------------------------

まず、AutoLayoutを使わない方法もあります
ViewControllerを選択して
・Use Auto Layout
・Use Size Classes
のデフォルトチェックを外します。

![スクリーンショット 2014-12-27 12.48.01.png](https://qiita-image-store.s3.amazonaws.com/0/55077/ffddf7b1-2d57-e1cd-5fdb-2c81e57461cd.png)


すると、従来通りAutoResizingが使えるようになります
![スクリーンショット 2014-12-27 13.19.43.png](https://qiita-image-store.s3.amazonaws.com/0/55077/aba25136-29fe-b31c-4406-caf84952b588.png)

ただし、この方法だと
iPhone5からiPhone6へ解像度を変えたときに
Viewのx方向の中央揃えとかがうまくいかなかったりします
（画面縦横比が違うため）

------------------------------------------

ここからが本題のxcode6でのAutoLayoutでのレスポンシブデザインです。
xcode6からiPhone用レイアウトファイル、iPad用レイアウトファイル
と分けずに全て１つのレイアウトファイルで
レスポンシブデザインできるようになりました。
端末解像度別レイアウトするためには
Size Classesという概念が新しく導入されました。

storyboard内下段のwAny,hAnyをクリックするとレイアウトタイプを選択できます。

![スクリーンショット 2014-12-27 13.34.28.png](https://qiita-image-store.s3.amazonaws.com/0/55077/76991b14-dbb7-f552-fe69-1ccd915c5b7e.png)


分類は以下の表になっているようです。

![autolayout.png](https://qiita-image-store.s3.amazonaws.com/0/55077/497975ba-e419-eceb-8ef3-8b8fd6871425.png)

Size Classesを変更すると
目的別（端末の向き、対応解像度）に設定したレイアウトになります

正確にはおそらく違いますが
ざっくり以下のように覚えていて問題ないと思います
・Compact:iPhone6 Plus以外のiPhone用レイアウト
・Reqular:iPhone6 Plus、iPad用レイアウト
・Any:どの端末でも使えるレイアウト

今回はレスポンシブにしたいので５番目の横２セル、縦２セルのAnyを使います。

今回作成するレイアウトです
![スクリーンショット 2014-12-27 12.43.25.png](https://qiita-image-store.s3.amazonaws.com/0/55077/d0b6e38d-f51d-e184-ba46-e6d663006398.png)

ViewControllerのSimulated Matrics欄のSize項目から
各種端末サイズのプレビュー確認できます。

![スクリーンショット 2014-12-27 13.53.46.png](https://qiita-image-store.s3.amazonaws.com/0/55077/adc198ad-137b-00e0-c393-c7212ccdb5ca.png)

AutoLayoutでの完成後レイアウトは次のようになります

3.5インチ（iPhone4S）
![スクリーンショット 2014-12-27 12.44.26.png](https://qiita-image-store.s3.amazonaws.com/0/55077/e5518393-abda-d2b6-a555-1f73b8c5d9ca.png)

4インチ(iPhone5,5S)
![スクリーンショット 2014-12-27 12.44.36.png](https://qiita-image-store.s3.amazonaws.com/0/55077/3b61a8b6-ccc4-4dc0-7636-89885505f1fa.png)

4.7インチ(iPhone6)
![スクリーンショット 2014-12-27 12.44.45.png](https://qiita-image-store.s3.amazonaws.com/0/55077/50585ff6-2075-d936-c53f-369eb5945892.png)

5.5インチ(iPhone6 Plus)
![スクリーンショット 2014-12-27 12.44.53.png](https://qiita-image-store.s3.amazonaws.com/0/55077/38a5bf32-ca49-7374-ffed-a88dce6ed5da.png)

iPadフルスクリーン
![スクリーンショット 2014-12-27 12.45.43.png](https://qiita-image-store.s3.amazonaws.com/0/55077/c4b21065-7f09-2569-0bc8-f6eb8c662f92.png)

------------------------------------------

では、下記の配置状態からAutoLayoutで実際に作っていきましょう

![スクリーンショット 2014-12-27 14.19.48.png](https://qiita-image-store.s3.amazonaws.com/0/55077/03f7ca7d-baf9-d3e6-c588-32651f6d01db.png)

AutoLayoutとはViewの配置やサイズにConstraints(制約)をつけることで
画面の解像度が変わってもその制約には従うことでレイアウトを保持するという概念です

制約なのでいくつかコツがあるみたいです
・基準となるView（中央のViewなど）を起点に制約をつけていくとやりやすい
・横方向の制約と縦方向の制約と切り分ける
・制約を追加する際に同じ方向にビューが多いと制約同士が衝突（コンフリクト）しやすい
・制約が足りない場合にも意図しないレイアウトになったりレイアウトエラーになる（位置だけでなくサイズの指定も必要）

今回の場合はTableViewを起点とします

①UITableViewの画面横方向を中央揃えにする
まず、TableViewを選択します。
その後、Controlキーを押しながらマウスドラッグして青い線を出し
親のViewへドロップします

Center Holizontally In Containerを選ぶと
親Viewに対して横方向中央揃えになります

![スクリーンショット 2014-12-27 14.30.13.png](https://qiita-image-store.s3.amazonaws.com/0/55077/fe0c9d08-9cb3-342f-6232-0183ad101a76.png)


②画面サイズにあわせてUITableViewの横方向をリサイズする
UITableView選択状態で
Editor→Pinから
Leading Space to SuperViewを選択します
完了後
同様に
Trailling Space to SuperViewを選択してください

![スクリーンショット 2014-12-27 14.37.07.png](https://qiita-image-store.s3.amazonaws.com/0/55077/ae8acaa8-9e12-083c-387b-45ba2dd09354.png)

・Leading Space to SuperView：左側のマージン
・Trailling Space to SuperView：右側のマージン
２つ設定すると画面サイズにあわせて横幅がリサイズされるようになります
（プレビューで確認してみてください）

ここまでで赤い矢印が表示されるようになると思います
![スクリーンショット 2014-12-27 15.09.46.png](https://qiita-image-store.s3.amazonaws.com/0/55077/eefce772-720c-37b6-7359-8c0fc60477fe.png)

赤い矢印をクリックすると
Y方向の位置と高さが指定されていないというレイアウトエラーが出ています

![スクリーンショット 2014-12-27 15.09.32.png](https://qiita-image-store.s3.amazonaws.com/0/55077/762df512-5045-46a0-d8d7-3f36b4b72480.png)

なので次に縦方向に関しての制約も追加していきます

③画面サイズにあわせてUITableViewの縦方向をリサイズする
UITableViewに
・Bottom Space to SuperView：親ビューに対する下側のマージン
を追加します。
次にUITableViewを選択しControlキーを押しながらマウスドラッグし
一括投稿UIButtonにドロップします
・Vertical Spacing：ビュー間のマージン
を追加します

![スクリーンショット 2014-12-27 15.21.17.png](https://qiita-image-store.s3.amazonaws.com/0/55077/b2045b17-f348-aaaf-410d-f1b23a8c657b.png)

同様に
一括投稿UIButtonからUITextFieldへVertical Spacingします

次にUITextFieldで
・Top Space to SuperView:親ビューに対する上側のマージン
を選択します


ここまでで縦方向に関する制約が揃ったので
UITableViewに関しては画面サイズを変えても
リサイズされるようになるはずです

![スクリーンショット 2014-12-27 15.35.36.png](https://qiita-image-store.s3.amazonaws.com/0/55077/33ed1590-0a8d-0e51-7e9b-28b55dc472dc.png)

後は残っている他のViewに対して制約を追加していきます

④一括投稿UIButtonとUITextFieldをUITableViewに揃える
一括投稿UIButtonからControlキーを押しながらUITableViewへドラッグドロップして
・CenterX:ビュー間の横方向揃え
を追加します

![スクリーンショット 2014-12-27 15.47.33.png](https://qiita-image-store.s3.amazonaws.com/0/55077/8349ff25-b1a8-67f1-9de5-1c9662630acc.png)

同様に
UITextViewから一括投稿UIButtonへCenter Xします

次にUITextViewからUITableViewにドラッグドロップし
・Equal Widths:ビュー同士の幅を同じにする
を追加します

ここまで行うと
一括投稿UIButtonとUITextFieldに関して画面サイズに合わせて
追従するようになります

![スクリーンショット 2014-12-27 16.05.10.png](https://qiita-image-store.s3.amazonaws.com/0/55077/67e4fe4d-84d7-f45b-8cae-015be5773ddb.png)

⑤twitter,Facebookアイコンとコントロールを画面サイズに合わせる
・twitterのUIImageView
・twitterのUISwitch
・facebookのUIImageView
・facebookのUISwitch
それぞれをUITextFieldに対してVertical Spacingします

![スクリーンショット 2014-12-27 16.08.37.png](https://qiita-image-store.s3.amazonaws.com/0/55077/d0dd6fbe-755e-6065-e6be-bb9ea26449bb.png)

次に
・twitterのUIImageView
・twitterのUISwitch
・facebookのUIImageView
・facebookのUISwitch
それぞれをUITextFieldに対してCenter Xします


その後
・twitterのUIImageViewとtwitterのUISwitch間
・twitterのUISwitchとfacebookのUIImageView間
・facebookのUIImageViewとfacebookのUISwitch間
に対してそれぞれ
・Horizontal Spacing:ビュー間横方向マージン
をします
![スクリーンショット 2014-12-27 16.22.49.png](https://qiita-image-store.s3.amazonaws.com/0/55077/2c2787d6-e97b-0d99-02ad-c02218a0fd12.png)

最後に
twitterのUIImageViewとfacebookのUIImageView
に対して
UIImageView選択後にEditor→Pinから
から
・Width:画面サイズによらず幅を固定する
・Height:画面サイズによらず高さを固定する
の制約を追加します

![スクリーンショット 2014-12-27 16.29.55.png](https://qiita-image-store.s3.amazonaws.com/0/55077/968431b3-d1ea-1f28-9d0f-5c9b34958cf1.png)

ここまでやると完成です。
画面サイズを変えてもレスポンシブなレイアウトになります

![スクリーンショット 2014-12-27 16.33.57.png](https://qiita-image-store.s3.amazonaws.com/0/55077/686860b0-d26c-42a6-b978-aa09cf396261.png)

⑥レイアウトが反映されていない場合
画面サイズを変えた場合に
Constraints(制約)通りのレイアウトになっていない場合は
・Update Frame
をすることで作成した制約に基づいて正しい位置にfixされます

![スクリーンショット 2014-12-27 16.37.51.png](https://qiita-image-store.s3.amazonaws.com/0/55077/5353682b-5691-dc39-25dc-e78c4026bc8a.png)

![スクリーンショット 2014-12-27 16.40.40.png](https://qiita-image-store.s3.amazonaws.com/0/55077/effc6b4b-6e6c-e84a-da4e-f1f2a138c56d.png)


---------------------
AutoLayoutのよく使うConstraints(制約)まとめ

画面中央揃え
・Center Holizontally In Container：横方向中央揃え
・Center Vertically In Container：縦方向中央揃え
・CenterX:ビュー間の横方向揃え
・CenterY:ビュー間の縦方向揃え
マージン、オートリサイズ
・Leading Space to SuperView：親ビューに対する左側のマージン
・Trailling Space to SuperView：親ビューに対する右側のマージン
（２つ設定すると画面サイズにあわせて横幅がリサイズされる）
・Top Space to SuperView：親ビューに対する上側のマージン
・Bottom Space to SuperView：親ビューに対する下側のマージン
（２つ設定すると画面サイズにあわせて縦高さがリサイズされる）
・Horizontal Spacing:ビュー間横方向マージン
・Vertical Spacing:ビュー間縦方向マージン

幅、高さ揃え
・Equal Widths:ビュー同士の幅を同じにする
・Eqaul Heights:ビュー同士の高さを同じにする
・Width:画面サイズによらず幅を固定する
・Height:画面サイズによらず高さを固定する