オープンソースプロジェクトMasonry目標は,Auto Layoutのコードをもっと簡潔で読みやすくすることだ。
Masonryは,XIBやStoryboardを必要としないエクスペリエンスを実現するために “Auto Layoutを適切なシンタックスでラップする,ライトウェイトなレイアウトフレームワーク” である。開発者のJonas Budelmann氏の主張によれば,AutoLayoutは強力である反面,そのコードは冗長で可読性の低いものになる傾向がある。
Masonryはドメイン固有言語(DSL, Domain Specific Language)である。制約の定義と更新,属性参照,プライオリティ設定,デバッグサポートといったAuto Layoutの持つすべての機能を,使いやすいメソッドとして提供する。
GitHubで公開されているサンプルコードは一般的な使用方法と同時に,Masonryのコードの簡潔さを示すようにデザインされている。
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);
}];
Auto Layoutの中核にあるのは制約(constraint)である。これはUI要素間の関係を数学的に表現したもので,優先度(priority)としきい値(threshold)で管理されたサイズと相対的位置で構成されている。制約は付加的に設定されることで干渉が発生することや,制約が不十分なために曖昧さを生じることがあるが,いずれの場合も例外をスローさせることが可能だ。
ビューの参照を持つNSLayoutConstraintを生成して属性や関連性を設定すれば,Masonryを使用せずにプログラム的に制約を生成することもできる。AppleもVisual Format Languageという,関連性をテキストとして定義するDSLを提供している。
Auto Layoutは義務的や排他的なものではなく,“Springs and Struts”方式のアプローチは現在でも有効だ。“Springs and Struts”,すなわち自動サイズ変更マスクとは,親ビューの境界が変更されたときの応答方法を定義するものだ。
AppleはAuto Layoutの採用に関して,説得力のある理由を用意している。
- “Springs and Struts”では画面の方向やスクリーンサイズの違い,動的コンテントのサポートなどのためにコードが必要。
- iOS 7のDynamic Typeにより,ユーザがアプリのテキストサイズを好みに合わせて指定可能。
- iOS 6とiOS 7の両方をサポートし,各要素のメトリック上の違いを吸収。
Auto Layoutにも基本的な問題がないとは言えない。Appleでは,一般的に使用されるUIScrollViewとAuto Layoutを併用するためのガイダンスを公開している。Matt Neuburg氏は“Auto Layoutがビュートランスフォームではうまく動作しない”理由に関して,説得力のある論証を行うとともに,その代用としてレイヤトランスフォームを多用するように推奨している。
Auto Layoutで作成するコードでは,Xcode 5で可能になったInterface Builderの拡張のメリットを享受することはできない。具体的にはAuto Layoutの問題を視覚的に解決する機能や,異なる方向,iOSバージョン,デバイスサイズの違いを確認するためのアシスタントエディタのプレビューモードなどだ。