[Xcode]なぜ表示されない・・・ビルドしたアプリのViewの重なりをXcodeで確認する方法

## はじめに

スマートデバイス・テクノロジー Advent Calendar 2015，
3 日目の投稿になります。よろしくお願いいたします。

最近は Storyboard にペタペタ載せていく感じなので
わかりやすいけど，いわゆる描画範囲指定して View 作って
addSubview して最前面にーとかも実装によってはまだ普通にある。
また，AutoLayout をしっかりかけたつもりが表示されなかったり。

しかし addSubview を多用するとあれー表示されないぞーとか，
なんでこの View がここにいるんだ？とかよく起きてくる。
実際にブレイクポイントでコードを追って，まずこいつが描画されて，
その後にこいつが描画されて，後ろに行って…とかやってみもいいけど
Xcode の __Debug View Hierarchy__ の機能で View の重なりを
見てコードを修正した方が視覚的に確認できる分修正も早いかもしれない。


## Debug View Hierarchy

前の現場で先輩に教えて貰った機能。Xcode 6 からあったという・・・
現在の現場で View の重なりを見て実装修正する機会がありました。
デバッグしたアプリの View や 各種表示がレイヤーで確認できたりします。
Mac に接続した実機，iOS シミュレータでも大丈夫です。Run した後，

Xcode のメニューで下記を選択。

　 __Debug->View Debugging->Capture View Hierarchy__

![01.png](https://qiita-image-store.s3.amazonaws.com/0/88266/4b7e6106-dcac-d43d-8f6d-d254c61221c4.png "01.png")

かまたは 下部のデバッグの境目にあるボタンでも確認可能です。
こっちの方がすぐアクセスできるので私は大体こっち使います。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/88266/f01c6045-226a-bdba-fd94-cc78026342c5.png "02.png")

静止時だけでなくタイミングよくボタンを押すことで画面上の表示を
レイヤー表示できるので短時間しか表示されない画面の確認も楽です。


サンプルを作ってみました。AutoLayout 系と addSubView 系を
2 つ試す予定でしたが，長くなりそうだったので前者だけにしました。
今回のサンプルは Github にあげました。必要であれば clone して
ください。既存プロジェクトでも確かめられるので不必要かもですね。

サンプル：[リンク](https://github.com/MilanistaDev/SDT_AdventCalendar2015_day3)(Github)

```
git clone https://github.com/MilanistaDev/SDT_AdventCalendar2015_day3.git
```

## CollectionView のセルがおかしかったときの話

先日，CollectionViewCell の Width のことについて書いたのですが，
それを例にしてみようと思います。[記事リンク](http://qiita.com/MilanistaDev/items/fbf5fb890d9a3a7180cd)(Qiita)

まず，UIViewController に CollectionView を AutoLayout を
上下左右 0 で載せます。セルに合わせて見た目を整え UILabel を追加し，
センターセンターで AutoLayout かけます。UIView をセルの左端に
追加し，Width を 20，AutoLayout 上下左 0 でかけます。(下図)


![03.png](https://qiita-image-store.s3.amazonaws.com/0/88266/9d16f6fc-f876-bd65-0a0f-511cca5bbf4a.png "03.png")

![04.png](https://qiita-image-store.s3.amazonaws.com/0/88266/a4a67e94-c73f-0394-25f5-0c9e8bad7c7b.png "04.png")


Cell の Width は合わせたので 600 になっています。Cell 自体に
AutoLayout かけれないけど CollectionView には AutoLayout
かけたし，大丈夫だよなぁ〜(セルのサイズ返すメソッドをコメントアウトに)

試しに東京メトロの路線を 9 路線分表示させてみましょう。
UILabel には路線名，UIView には色をつける。
背景色はすこし透過させたものにする。(詳細はコード参照)

実行してみると・・・

![05.png](https://qiita-image-store.s3.amazonaws.com/0/88266/77b71617-5d0c-6d37-3736-60a2502ebabb.png "05.png")

あれ？一番左のメトロカラーが見えてないですね・・・
ここで __Debug View Hierarchy__ 起動！ドラッグしてみると・・・

![06.png](https://qiita-image-store.s3.amazonaws.com/0/88266/6dfc4089-7f2b-d358-8201-5dd13c0b1cfb.png "06.png")


ぐりぐり動かせて View の重なりを確認できる。
[GTK+](http://www.gtk.org) とか [three.js](http://threejs.org) でこういうのあった気がする。

レイヤーの幅調節バーの隣のボタンを押してみると・・・

![07.png](https://qiita-image-store.s3.amazonaws.com/0/88266/10193a96-c79d-e11f-5d1a-e60554ba1df7.png "07.png")


こんなとこにいたーーー！なるほど画面外にいるのか〜とわかる！！

こうなってたので先日の記事で CollectionViewCell の大きさを
画面サイズに応じて返すように UICollectionViewDelegateFlowLayout の
Delegate メソッドを書いたわけです。

さて，コメントアウトを外してセルの大きさを Width はディスプレイ
サイズの Width，Height は 100 くらいで返してあげます。
今度は画面にメトロカラーの View が表示されると思います。

シミュレータだとこんな感じ。(ミスって 6s Plus のにしちゃいました)

![09.png](https://qiita-image-store.s3.amazonaws.com/0/88266/17ab9be1-9142-6db1-646f-df60d0cb8cb6.png "09.png")


ここで __Debug View Hierarchy__ 起動！ドラッグしてみると・・・

![08.png](https://qiita-image-store.s3.amazonaws.com/0/88266/5b61474d-76c7-8229-2ec9-06b804e99a30.png "08.png")

画面にセルが収まり，メトロラインカラーの View も描画されていますね。

AutoLayout 系は 2D，addSubView 系は 3D って感じですかね。

View を多く addSubView した複雑な画面の場合は，見た目のチェックと
Debug View Hierarchy のチェックをすればバグを減らせそうですね。

例えば，ボタンが反応しない場合，見てみると違う UIView が上に存在
していたとか，うまく見えてはいるが，他画面に遷移して戻った際に
おかしくなるとかいったときに試してみるといいかもしれません。

## おわりに

今回は Xcode の Debug View Hierarchy について書きました。
View の表示で困ったらぜひ使いたい機能です。
また，View が複雑な UI 関係の試験でも使えるかもしれません。
見た目：OKだけじゃなく，View の重なりも試験項目書に書くなど。
もしかしたら現場によってはリリースしたアプリもとんでもない表示に
なってたりしているかもしれないですね。

ご覧いただきましてありがとうございました。
ご意見ご感想，もっとこうした方がいいなどありましたら
気軽にコメント欄にお願いいたします。

(株)スマートデバイス・テクノロジーではスマホアプリを作りたい
iOS，Android エンジニアを募集しております。業務未経験でも
研修を通して知識を身につけることができます。
もちろんアプリエンジニアに転身したい方も大歓迎です。
詳細は下記のページをご覧ください。

「え！？未経験でもいいの！？」はい、ベンチャーエンジニアになりましょう！
https://www.wantedly.com/projects/13720
「スマートフォンエンジニアに転身したい」そんなITエンジニア集合！
https://www.wantedly.com/projects/15882