Apple公式のiPhoneアプリチュートリアルやってみた①(Build a Basic UI)

#Apple公式のiPhoneアプリチュートリアルやってみた。
突如iPhoneアプリを作りたいと思い立ち、公式チュートリアルをやってみました。
なかなか英語が大変だったので、自分用にメモしておきます。

今回参考にしたドキュメントは、コレ→ [Start Developing iOS Apps (Swift)](https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/index.html#//apple_ref/doc/uid/TP40015214-CH2-SW1)

###始めに
今回は、食事を記録しておくためのアプリを作っていきます。アプリの中では、食事リストが表示され、リストの中には写真、食事の名前、5段階評価、写真が表示されます。さらに、食事のリストを別画面から追加したり削除したりできるという、いろんなアプリの基本になる機能が備わっています。

![スクリーンショット 2017-02-13 13.21.32.png](https://qiita-image-store.s3.amazonaws.com/0/142797/40b9e57e-d8d9-06f9-7312-00f9de419484.png)

###1.基本的なUIの作成

1.Xcodeを開く（アイコンをダブルクリック）。
2.「Create a new Xcode project」を選択。
3.「Single View Application」を選択。
![スクリーンショット 2017-02-13 13.33.28.png](https://qiita-image-store.s3.amazonaws.com/0/142797/e6ada84d-da8c-2d78-6ed6-cd856075e35c.png)


4.各種情報を入力するウィンドウが立ち上がるので、
下のように選択する。

Product Name: FoodTracker（自分でアプリ作るときは、任意の名前でも可能）
Language: Swift
Devices: Universal
Use Core Data: Unselected.
Include Unit Tests: Selected.
Include UI Tests: Unselected.

5.Xocodeの各パートの説明。
![スクリーンショット 2017-02-13 13.37.22.png](https://qiita-image-store.s3.amazonaws.com/0/142797/c7e4d336-4b52-b3c2-078f-d80869ead2dd.png)

6.上書き保存。（Command + S）
7.エミュレーターの立ち上げ。（Command + R）
<br>
######メモ
######AppDelegate.swift
機能：
1.AppDelegateクラスを定義している。このクラスはすべてのコンテンツが表示されるwindow(画面)を作成してる。
2.UIApplicationMain属性により、イベントを感知するループを回している。

で、 AppDelegateクラスは、windowプロパティを持っている。
var window: UIWindow?
で、これは作成するアプリのroot　windowを参照していて、viewクラスの最上位に位置していてこのクラスが他のコンテンツを包括している。
（このメモについては、理解不足でわからないまま書いています。分かる人がいれば間違いを教えてもらえると嬉しいです、、、、、、＞＜）

######ViewController.swift
機能：



You’ll start writing code in this source code file later in this lesson.


8.Xcodeの右下のObject libraryから、パーツを選択。ストーリーボードにドラッグ&ドロップ。
![スクリーンショット 2017-02-13 14.05.35.png](https://qiita-image-store.s3.amazonaws.com/0/142797/028f6524-c95a-8cc8-0a26-56d961810306.png)

9.オブジェクトライブラリから選んだ、オブジェクトのプロパティを設定するには、右上のユーティリティーエリアから、
あトリビュートインスペクタを選択。値を設定する。今回はPlaceholderにEnter meal nameをと入力。

![スクリーンショット 2017-02-13 14.09.53.png](https://qiita-image-store.s3.amazonaws.com/0/142797/d89f3fc6-af48-a7ec-02dd-82880e995571.png)

10.下記の写真のようにオブジェクトをストーリーボードにドラッグ&ドロップ。
![スクリーンショット 2017-02-13 14.12.53.png](https://qiita-image-store.s3.amazonaws.com/0/142797/d71d6c62-d094-6262-773a-f56592550ebe.png)

そして、ラベルとボタンにそれぞれテキストをセットします。

11.アウトラインビューの見方
左下ににあるアウトラインビュートグルを押すと、階層状になっている
アプリのエレメントの構造を確認できます。
<img width="680" alt="BBUI_outlineview_toggle_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/9d19d175-9ca9-afec-3956-0fd9b813701b.png">
<br>
これがアウトラインビューです。
<img width="243" alt="BBUI_outlineview_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/b3881362-6176-bddd-b558-282c2a7bab7f.png">

12.assistant editorを使った表示確認
assistant editorを使うと、異なるスクリーンサイズで(ex iPhone7,6等)、異なる画面の向き（縦・横）で要素のレイアウトの確認ができます。

　1.assistant editorを表示するにはまずこのボタンを押します。
<img width="307" alt="assistant_editor_toggle_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/0a064624-a37d-cc76-34a3-529df54f692f.png">

 2.次に、このボタンで左右の邪魔な表示エリアを閉じます。
<img width="373" alt="navigator_utilities_toggle_on_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/b41b4c96-e28c-b945-6744-f33de8d4ee3b.png">

 3.そして次にアシスタントエディタのTOPに,Main.storyboard を表示させるために、Automatic to Preview > Main.storyboard (Preview)を選びます。
<img width="680" alt="BBUI_assistant_editorselectorbar_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/bb2fc16c-af99-eeae-de87-9e790a13b054.png">

<img width="680" alt="BBUI_assistant_editorselectorbarpreview_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/d69597e5-7e58-bc9f-af1b-5191e644b56e.png">

そうするとこんな画面になります。
<img width="680" alt="BBUI_preview_same_2x (1).png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/0a1d552c-5775-36aa-6619-3dd765b1f87a.png">

　4.横向きの画面（landscape orientation）にするためには、下のボタンを押します。
<img width="389" alt="BBUI_preview_rotatebutton_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/477c5565-46c0-89be-1a04-9197cc0b5862.png">

するとこんな画面になります。
<img width="680" alt="BBUI_preview_rotated_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/29938b76-a24c-c505-704d-61b94d329c75.png">

残念ながらテキストフィールドが画面いっぱいに表示されていません。

　5.別のスクリーンサイズで見たいときはこのボタンを押します。
<img width="680" alt="BBUI_preview_addSE_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/35a245d9-c7c9-aa82-d294-92865af69731.png">


<img width="334" alt="BBUI_preview_small_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/df4e4811-4578-e117-8440-45b739c41a5f.png">

iPhone SEで確認してみましたがテキストフィールドの右端がはみ出しています。いろんなスクリーンサイズに対応するアプリのデザインを作るためには、それぞれのスクリーンサイズに合わせて要素（例：ボタン、テキストフィールド）のサイズ・位置が変わるように指定しなければなりません。



######Auto Layout
Auto Layoutは、どのような画面サイズの変化にも対応する手助けをしてくれるレイアウトエンジンです。constraintsをというレイアウトをしているするルールを使って要素が、どの要素に対応して配置しているか、その要素のサイズは何かを指定します。

一番簡単なレイアウトの指定の仕方は、stack view (UIStackView)を使うことです。これはstreamlined interfaceによって要素を列と行のどちらかに配置します。

Auto Layoutを使うには既に配置した要素を、stack viewで包み込む必要があります。それから要素を配置するために必要なconstraintsを追加します。

######Auto Layout constraintsを現在の画面に追加する。

　1.まずはXcodeのレイアウトを元に戻します。
<img width="372" alt="standard_toggle_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/58f9fd02-eae3-2912-fd9a-df2a79b47edb.png">

　2.Shiftボタンを押しながら、Main.sotryボード上の要素をクリックします。（写真のように）
<img width="680" alt="BBUI_AL_shift_select_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/f3f98a67-d5c7-85cf-7cfa-a0e510d54571.png">

 3.Xcodeの右下にあるEmbed In Stackボタンを押します。（もしくはEditor > Embed In > Stack Viewを選択）

<img width="680" alt="BBUI_AL_stackmenu_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/cff4b966-717f-c425-4105-885d165b33c3.png">

これで選択された要素は、stack viewに包まれました。
Xcodeは、現在のレイアウトを分析し、それぞれの要素が上から順に積まれたものだと解釈しました。

 4.もし必要であれば、outline viewの中からStack View objectを選択してください。

<img width="243" alt="BBUI_AL_outlineview_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/9f56becc-c3af-97b0-3515-a557b5f7a5f8.png">

 5.そしてAttributes inspectorの、Spacing fieldに、8とタイプすると垂直方向に要素の間のスペースが追加されたことがわかります。

 6.そして次にXcodeの右下にあるAdd New Constraintsボタンをクリックします。

<img width="680" alt="BBUI_AL_pinmenu_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/10978ae3-b56b-fc77-de93-3d9f86ebede9.png">

 7.左右上の、「　I　」の字型の部分をクリックする。
そして、左右のテキストフィールドに0を入力、上には20を入力。
その下にある、Update FramesのItems of New Constraintsを選択、最後に、Add 3 Constraints ボタンを押して、Constraintsを追加する。 

<img width="284" alt="BBUI_AL_pinconstraints_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/d18a9106-bbf7-ee5c-8e8f-8b8c2234b13e.png">



このconstraints部分は、一番近い前、後、上の別の要素とのスペースを指定している。ここでは一番近い別の要素とはsuperview、もしくはマージンです。なぜなら、“Constrain to margins” のチェックボックスが選択されているので、superviewの左右のマージンに対してstack viewが配置されています。このsuperviewの左右のマージンのおかげで、stack viewと画面の端にはスペースが空いています。

対照的にTOPのconstraintsは、画面のtop layout guideに対応しています。そしてtop layout guideは、status barの底です。もしstatus barがなければ画面の上は時にひっついてしまうので少しスペースを追加する必要があるのです。

#####メモ
ちなみにsuperviewは、階層構造の中で一番上にあるviewで、ひとつしかありません。その配下にあるのがsubviewsと呼ばれています。（複数存在可）

<img width="243" alt="BBUI_outlineview_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/18c86671-6234-6262-590f-0a9af33424b8.png">

ただ、この時点では、まだテキストフィールドの右端が伸びていないです。
これを修正するためにconstraintsを追加しましょう。

######テキストフィールドの幅を調整する

 1.テキストフィールドを選択する。
 2.Add New Constraintsメニューを再度開く。
<img width="105" alt="AL_pinmenu_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/bb381b81-c34f-1b45-6061-624e8502775c.png">

 3.右側の「 I 」の字のパーツ(constraint)を選択する。
　　4.0を入力する。
　　5.Update FramesのItems of New Constraintsを選択、Add 1 Constraints ボタンを押して、Constraintsを追加する。 

<img width="680" alt="BBUI_AL_textfieldconstraint_2x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142797/f9df41da-fe78-3e6e-73a8-91e6416dd7fa.png">

その後、iOS Simulatorを立ち上げ（Cmd + R）、Hardware > Rotate Left and Hardware > Rotate Right をしてデバイスの向きを変える。横向き（landscape orientation）にした時に、電波や充電の状態が表示されたステータースバーが消えることに注目。

そしてテキストフィールドの中をクリックするとキーボードが表示されます。



######Auto Layoutをデバッグする
もし期待した挙動と違っていれば、画面右下にあるUpdate Frames ボタンと、Resolve Auto Layout Issuesメニューボタンを使ってデバッグができます。

・Update Framesボタン
このボタンは選択したViewとsubViewをアップデートする。（よくわかってないです。）

・Resolve Auto Layout Issuesメニューボタン
　　・Choose Reset to Suggested Constraintsは、正しいConstraintsの値でアップデートする。

　　・Choose Clear Constraints は全てのconstraintsを取り除く。


[Apple公式のiPhoneアプリチュートリアルやってみた②(Connect the UI to Code)](http://qiita.com/naogify/items/6745982e28bbd3051240#_reference-60443b6a14e719266bca)に続く。