UIの実装におけるAuto Layout、AutoresizingMask、コードによる実装の使いわけ

  • 66
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

iOSノウハウ集(2014年版) - Qiita
こちらの記事でいろいろなノウハウ書いたのですが、ここではUIの実装のやり方に絞って書きます。引き続きheathrow社ブログの転載です。好きなファッションブランドをまとめ読みFavricaというiOSアプリを作っています。

UIパーツの位置指定に関する3つの選択肢

iOSではUIパーツの位置を指定するのに、現在3つの選択肢があります。

  1. AutoresizingMask
  2. Auto Layout
  3. コード

3つもあるとどれを選択するかを感覚的に選んでしまっていて、脳に負荷がかかるので、ここで僕がしている使い分けの仕方を書いておきます。

AutoresizingMask

デフォルトの選択肢はAutoresizingMaskにしています。iOS5まではこれがGUIによる実装の唯一の選択肢でした。コードによる実装をすることがあっても、大体はこちらと併用しています。

AutoresizngMaskの注意点

UIViewControllerのviewにUIパーツを配置していきますが、その時に、UIのブロック単位(機能的、視覚的なまとまり)をUIViewで管理しておきます。そうするとそのブロックそれぞれを表示・非表示やアニメーションなどをするときにしやすくなります。後からそうした配置にしようとすると、結構な手間になるので、意識的にラッパーとなるUIViewを入れていきます。

Auto Layout

最初はとっつきにくいのですが、慣れると素早く配置出来ますし、サイズ違い、具体的に言うとiPhone5と5以前の高さの違いを吸収するのに便利です。相対的な位置の指定が可能で、それによって高さの違いがあってもレイアウトが崩れない状態をコードなしで実現出来ます。
サイズ違いというと、iPhone6では横にも伸びるという噂ですので、その対応を考えると、Auto Layoutにしておくとコストが低いかもしれません。

Auto Layoutを使うべきでないシチュエーション

Auto Layoutは操作によって位置が変わるViewがあると、大変なイメージがあります。現在iOSの開発でオリジナルのアニメーションをつけるには、コードを書く必要がありますが、Auto Layoutをコードで制御するのは悪夢とのこと。
プログラム(Visual Format Language)によるAuto Layout

  • UIScrollView
    • Auto Layoutを使って意図した配置になったことがありません。またAuto Layoutが入ってるとデフォルトでタッチに反応しなかったりします。
  • Viewの位置が変わるUI
    • 上記のとおり位置が変わると大変なので辞めましょう

Auto Layoutを使うべきシチュエーション

使うべきところはどこか。
iOSアプリケーション開発のコードレビューで気をつけていること - ninjinkun's diary
こちらの記事にもありますが、UIViewControllerのviewのような場所ではなく、そのsubviewにあたる部分(この記事ではUITableViewCell)、パーツのようなところでは使っていくとよいです。アニメーションするにしても、大体はパーツ自体の内部的な位置は変わらないことが多いですしね。
また、AutoLayoutではAutoresingMaskと違ってラッパーのUIViewをあまりいれなくてもよくなります。というか、配置するときに必要になってViewを追加するので、AutoresizingMaskのように意識しなくても大丈夫です。

コードによる実装

すべてが動的に変る場合はすべてコードで書きます。
Favricaというアプリの実装では、ブランドのタブの部分のViewはすべてコードです。

iOSシミュレータのスクリーンショット_2014_04_24_21_38_28.png

UIScrollViewが、ブランド名によって長さが変わるUIButtonをフォローしているブランド数だけ持っているという状態なので、ボタン同士の距離を定数化し、UIButtonの大きさを計算してレイアウトしています。

まとめ

使い分けと書いたのですが、それぞれパーツごとに選べるし併用もできたりするので、こういう場合はこう実装しろ!みたいなクックブック形式のほうが却って網羅性という意味でもいいのかもと思いました。使い分けと書くと抽象化が過ぎてしまうということですね。
俺はこうしているぞみたいなのもっと見たいので、みなさまどうぞお願いします。