Xcodeコメントコメントする衝撃的な話から入りますが、なんとiOS開発歴4年目でAutoLayoutデビューを果たしました(最近の話)。重い腰を上げたという感じですが、ぎっくり腰だったんじゃないかと思いたくなるほどで、コードを書く者としては罪深いことをしてしまったような気がしています。知識的な勉強から始めたわけですが、StoryboardによるGUI的なやり方はどうも手をつける気持ちになれませんでした。なんというか「コード」と言う名の引力が僕を引っ張っている感じなんです。(?)VisualFormat無用論コードによるAutoLayoutにはconstraintsWithVisualFormat()とNSLayoutConstraint(item:...)の2種類があることがわかりました。「あ、ダメだわこれ」となり、VisualFormatは却下する運びとなりました。・RunするまでFormatの文法ミスに気づきにくいなどなど。視認性の高さがメリットだと思って飛びついたのにその悪化っぷりは凄まじいものでした。快適性と保守性を考慮した準備をして複数のViewをレイアウト(垂直方向)したところ、下記のように非常に見づらくなってしまいました。self.page1Subviews)これでもまだViewサイズが数字の直接入力ですからね。視認性と柔軟性があれば最初の学習コストは問題ないでしょうが、僕には使うメリットは感じられませんでした。2つ目の選択肢となると残るはNSLayoutConstraint(item:...)のみとなります。以下のコードを見てわかる通り、とにかくコードが冗長なんです。40)しかもこれでやっと1つの属性をセットしただけです。0)と1行で一気に設定できてしまうことを考えればあまりに長いです。constantみたいに入力できれば楽じゃないかということです。(プログラミングは自前でツールを作れるということを一瞬忘れていました)そして結論から言うと、作った関数がこちら。50)最初のselfはレイアウトするView自身で、そのViewのクラス内で実行しています。Requiredというのはpriorityの種類を指します(後述)。引数名などに(プログラミング的に)難があるかもしれませんが、式をベースに1行程度で収まるようにしました。具体的なコードすべてUIViewのエクステンションに作成してます。isEqual:引数で使うための属性プロパティです。タプルでView自身と対応したNSLayoutAttributeを返します。}}続いて先ほどご紹介したレイアウトメソッドです。priorityを引数で指定するようにすると冗長になるのでメソッド別にしました。priority:Requiredでconstraintを追加する。priority:Lowでconstraintを追加する。priority:Highでconstraintを追加する。Constraintを生成する。self.superview!.addConstraints([constraint])}}widthやheightの場合はtoItemをnilにしたいときも頻繁にあります。そこでisEqual:にself.attrNil()を渡し、メソッド内で判別することで手軽にnil指定できるようにしました。対象のitemがnilかどうかによって要素を変える。equalElements}これで以下のように4行程度(例えばcenterX・top・width・height)で一通りのレイアウト設定ができるようになります。調べてみると、AutoLayoutではUILabelのsizeToFit()が使えないことがわかりました。スタックオーバーフローの回答を参考にsizeToFit()に相当するメソッドを作成しました。preferredMaxWidth}}これでheightのconstraintのpriorityをLowに設定したうえで呼び出せば、sizeToFit()と同等のレイアウトが可能です。0)self.sizeToFitWithAutoLayout(0)これらの工夫でAutoLayoutの実装がかなりしやすくなりました。UIScrollViewのcontentSizeのセットこれらの方法でconstraintを追加していってもUIScrollViewがスクロールしませんでした(VisualFormatでは動きました)。調べてみたところ、AutoLayoutの実行が完了したviewDidAppear()であればscrollView.contentSizeへの代入が機能することがわかりました。intrinsicContentSize()も気になっているものの、とりあえずこれで様子見してみようと思います。よって作られています。