iOS 6から登場したAuto Layoutは、マルチデバイス・可変レイアウト対応が必要な現在のiOS開発において、無くてはならないものになりました。 しかしその裏側で、一体どんな仕組みでレイアウト計算が行われているのか、ご存知ですか? このプレゼンでは、Appleのブラックボックスの中身を数学的手法で紐解いていくとともに、 Auto Layoutを再発明する上での型安全な設計のテクニックを紹介します。
AbemaTVの@inamiyです。 台風が来る仲お越し下さりありがとうございます。
限られた時間ですべて把握するのは難しいテーマですが、流れを理解していただければ成功かと思います。
Abemaからは8名登壇です!
今は様々な画面サイズがあります。のどかな時代は終わりました。
ベゼルレス、画面が長方形ですら無いiPhoneが出ましたね。
昔から開発されていた人はFrameを計算したりAutoResizingMaskを使ったりしていました。
iOS6でAutoLayoutが登場。 PaddingやViewの感覚を指定できるようになりました。
制約ベースのレイアウト。コードでもGUIでも指定することができます。
ビジュアルフォーマットというクールなものもあります。使っている人を見たことはないですが。
やるならこうですね
AutoLayoutは属性や関係性を定数や式で表します。
関係性、つまり順番に依存しない、宣言的に記述します。
関係式はイコールだけではなく不等式や優先度が指定できます。
これらのアルゴリズムはどう実装出来るでしょう
最も簡単なパターンを考えていきます
重なっている領域が実行可能領域
Autolayoutっぽい
シンプレックス法のほうが差分更新できて便利。どこかネットに落ちていないか探したら
地球上で最も危険他鳥、火喰い鳥?頭がモヒカンだからね
x1, x2に非負条件が無いとシンプレックス法は使えない
x1を大きくしていくとZはまだ小さくなれる
全体を3で割ってx1を全部消す、ガウス消去法。
x2を増やすとまだzを小さく出来る
最終的に
これが最適値。
どのようにこのステップを通してグラフ的に変わっていっているか
シンプレックス法は外側の辺をなぞっていく
初回で解が求まらないなら
更に効率的な方法を求めるなら
シンプレックス法を理解したところで本題
結果
難しいパターン
今まで目的関数について余り考えてこなかったが、目的関数を作って重みを付けている。
こんな感じで解ける
小刻みにサイズが変わる時
わかった人もわからなかった人もいると思うが、足し算掛け算、簡単な行列操作のみです。
2属性以上をやりだすと人類に早すぎるというAppleのメッセージなのかな
One more thing …
OSS化しているのでぜひみて見て下さい。コード読まなくてもぜひスターを押していただいて
(会場笑い)
QA
- Cassowaryや双対シンプレクス法を使っているというのはどこがソースですか
- Cassowaryを知っていて役立ったことはありますか
- 作ったばかりでまだわからないですね。AutoLayoutという便利なものがあるんでそれを使えばいいと思います。趣味で作ったので業務で使おうと思わないほうがいいです
- UIKitではできない等間隔配置、Cassowaryでは簡単にできるのですか
- 簡単ですが、まぁ、仕事では使わないようにして下さい
- 今までの話を聞いて思ったのが、AutoLayoutの計算量が多いのではないかと思ったのですが、実際AutoLayoutでここまで計算して制約をつけるメリットは有るのでしょうか
- すごい遠い子孫関係のレイアウトまで指定できる。とはいえ人間の理解を超える部分もある、難しいと言われるのはそういうところにゆえんがあると思っている。
- いまGithubにあるCassowaryにスターを付けました。聴きたいのですが、このフレームワークはNSLayoutConstraintに依存していますか
- 全く依存していません
- AutoLayoutのフラグは不要?
- 不要です。Linuxでやろうと思えばそちらに応用もできる。UIKitに乗らずにやることもできます。
- AutoLayoutのフラグは不要?
- 全く依存していません