寄付窓口はこちら

Auto Layoutのアルゴリズム | iOSDC Japan 2017 Day1

iOS 6から登場したAuto Layoutは、マルチデバイス・可変レイアウト対応が必要な現在のiOS開発において、無くてはならないものになりました。 しかしその裏側で、一体どんな仕組みでレイアウト計算が行われているのか、ご存知ですか? このプレゼンでは、Appleブラックボックスの中身を数学的手法で紐解いていくとともに、 Auto Layoutを再発明する上での型安全な設計のテクニックを紹介します。

f:id:niwatako:20170916102805j:plain

AbemaTVの@inamiyです。 台風が来る仲お越し下さりありがとうございます。

限られた時間ですべて把握するのは難しいテーマですが、流れを理解していただければ成功かと思います。

f:id:niwatako:20170916103115j:plain

Abemaからは8名登壇です!

f:id:niwatako:20170916103134j:plain

今は様々な画面サイズがあります。のどかな時代は終わりました。

ベゼルレス、画面が長方形ですら無いiPhoneが出ましたね。

f:id:niwatako:20170916103205j:plain

f:id:niwatako:20170916103214j:plain

昔から開発されていた人はFrameを計算したりAutoResizingMaskを使ったりしていました。

iOS6でAutoLayoutが登場。 PaddingやViewの感覚を指定できるようになりました。

f:id:niwatako:20170916103257j:plain

制約ベースのレイアウト。コードでもGUIでも指定することができます。

f:id:niwatako:20170916103318j:plain

f:id:niwatako:20170916103325j:plain

ビジュアルフォーマットというクールなものもあります。使っている人を見たことはないですが。

やるならこうですね

f:id:niwatako:20170916103340j:plain

AutoLayoutは属性や関係性を定数や式で表します。

f:id:niwatako:20170916103401j:plain

f:id:niwatako:20170916103407j:plain

f:id:niwatako:20170916103432j:plain

関係性、つまり順番に依存しない、宣言的に記述します。

関係式はイコールだけではなく不等式や優先度が指定できます。

f:id:niwatako:20170916103523j:plain

これらのアルゴリズムはどう実装出来るでしょう

f:id:niwatako:20170916103531j:plain

f:id:niwatako:20170916103540j:plain

f:id:niwatako:20170916103605j:plain

f:id:niwatako:20170916103621j:plain

f:id:niwatako:20170916103609j:plain

f:id:niwatako:20170916103625j:plain

f:id:niwatako:20170916103627j:plain

f:id:niwatako:20170916103651j:plain

最も簡単なパターンを考えていきます

f:id:niwatako:20170916103719j:plain

f:id:niwatako:20170916103724j:plain

f:id:niwatako:20170916103732j:plain

重なっている領域が実行可能領域

f:id:niwatako:20170916103807j:plain

f:id:niwatako:20170916103848j:plain

Autolayoutっぽい

f:id:niwatako:20170916103902j:plain

f:id:niwatako:20170916103905j:plain

シンプレックス法のほうが差分更新できて便利。どこかネットに落ちていないか探したら

f:id:niwatako:20170916103949j:plain

f:id:niwatako:20170916103952j:plain

CocoaはLion、iOSは6から対応

f:id:niwatako:20170916104023j:plain

地球上で最も危険他鳥、火喰い鳥?頭がモヒカンだからね

シンプレックス法

f:id:niwatako:20170916104045j:plain

x1, x2に非負条件が無いとシンプレックス法は使えない

f:id:niwatako:20170916104124j:plain

f:id:niwatako:20170916104146j:plain

f:id:niwatako:20170916104203j:plain

x1を大きくしていくとZはまだ小さくなれる

f:id:niwatako:20170916104226j:plain

f:id:niwatako:20170916104306j:plain

全体を3で割ってx1を全部消す、ガウス消去法。

f:id:niwatako:20170916104334j:plain

x2を増やすとまだzを小さく出来る

最終的に

f:id:niwatako:20170916104353j:plain

これが最適値。

f:id:niwatako:20170916104412j:plain

どのようにこのステップを通してグラフ的に変わっていっているか

f:id:niwatako:20170916104438j:plain

f:id:niwatako:20170916104442j:plain

シンプレックス法は外側の辺をなぞっていく

f:id:niwatako:20170916104459j:plain

f:id:niwatako:20170916104505j:plain

f:id:niwatako:20170916104527j:plain

初回で解が求まらないなら

f:id:niwatako:20170916104551j:plain

f:id:niwatako:20170916104615j:plain

更に効率的な方法を求めるなら

f:id:niwatako:20170916104635j:plain

f:id:niwatako:20170916104638j:plain

f:id:niwatako:20170916104648j:plain

f:id:niwatako:20170916104658j:plain

f:id:niwatako:20170916104712j:plain

シンプレックス法を理解したところで本題

f:id:niwatako:20170916104746j:plain

f:id:niwatako:20170916104810j:plain

f:id:niwatako:20170916104824j:plain

f:id:niwatako:20170916104918j:plain

f:id:niwatako:20170916104945j:plain

結果

f:id:niwatako:20170916105001j:plain

f:id:niwatako:20170916105005j:plain

f:id:niwatako:20170916105052j:plain

難しいパターン

f:id:niwatako:20170916105113j:plain

f:id:niwatako:20170916105152j:plain

今まで目的関数について余り考えてこなかったが、目的関数を作って重みを付けている。

こんな感じで解ける

f:id:niwatako:20170916105238j:plain

小刻みにサイズが変わる時

f:id:niwatako:20170916105303j:plain

f:id:niwatako:20170916105325j:plain

f:id:niwatako:20170916105358j:plain

f:id:niwatako:20170916105402j:plain

わかった人もわからなかった人もいると思うが、足し算掛け算、簡単な行列操作のみです。

f:id:niwatako:20170916105410j:plain

f:id:niwatako:20170916105441j:plain

f:id:niwatako:20170916105530j:plain

2属性以上をやりだすと人類に早すぎるというAppleのメッセージなのかな

One more thing …

f:id:niwatako:20170916105554j:plain

OSS化しているのでぜひみて見て下さい。コード読まなくてもぜひスターを押していただいて

(会場笑い)

f:id:niwatako:20170916105626j:plain

QA

  • Cassowaryや双対シンプレクス法を使っているというのはどこがソースですか
    • ハッカーニュースでもとAppleのエンジニアだよという人がいて、それらしい話をしていたとか一般に総噂されているとかこれらが確立してからAutolayoutが登場したという背景
  • Cassowaryを知っていて役立ったことはありますか
    • 作ったばかりでまだわからないですね。AutoLayoutという便利なものがあるんでそれを使えばいいと思います。趣味で作ったので業務で使おうと思わないほうがいいです
  • UIKitではできない等間隔配置、Cassowaryでは簡単にできるのですか
    • 簡単ですが、まぁ、仕事では使わないようにして下さい
  • 今までの話を聞いて思ったのが、AutoLayoutの計算量が多いのではないかと思ったのですが、実際AutoLayoutでここまで計算して制約をつけるメリットは有るのでしょうか
    • すごい遠い子孫関係のレイアウトまで指定できる。とはいえ人間の理解を超える部分もある、難しいと言われるのはそういうところにゆえんがあると思っている。
  • いまGithubにあるCassowaryにスターを付けました。聴きたいのですが、このフレームワークはNSLayoutConstraintに依存していますか
    • 全く依存していません
      • AutoLayoutのフラグは不要?
        • 不要です。Linuxでやろうと思えばそちらに応用もできる。UIKitに乗らずにやることもできます。