<div style="font-size:50%"> 深入淺出 `Auto Layout` 原理篇 Ep.1 === ![](https://i.imgur.com/Eq28AFU.png) </div> --- <p style="text-align:right"> Jerry </p> ---- ## I'm Jerry Lin #### iOS CAMP [GitHub](https://github.com/aa08666) [Medium](https://medium.com/@kc50047) --- ## Why Auto Layout? ---- ### 有一天 iOS 平台上出現了不同尺寸的移動設備 ---- ![](https://i.imgur.com/KxrG0xb.png) ---- ### 使得原有的 `frame` 佈局方式無法很好地適應不同尺寸的螢幕 ---- ### 而為了解決這個問題: ## Auto Layout 就誕生了。 ---- ## 什麼是 `frame` ---- ![](https://i.imgur.com/qrtKg5Z.png) ---- `frame` 表示與父視圖之間的絕對距離 ---- ### 需要特別注意的是 > 這些值的單位是 points (點),而不是 pixels (像素)。 ---- #### 為什麼要用 points 而非 pixels? >因為 View 在 Retina 和非 Retina 螢幕上的大小無法保持一致。 > >而 points 會取決於螢幕解析度來決定多少 pixels 顯示一個點。 --- ![](https://i.imgur.com/LSWN1up.png) --- `Auto Layout` 中大部分的約束都是`描述性`的 * 一個 View 的約束是相對於另一個 View 的,比如說相對於父視圖,或者是相對於兩兩 View 之間的。 ---- ![](https://i.imgur.com/0vm2YAg.png) ---- ### Nearest neighbor ![](https://i.imgur.com/eHT08vu.png) --- ## Cassowary 算法 ---- 一個名叫 Cassowary 的佈局演算法解決了使用者界面的佈局問題,它通過將佈局問題抽象成線性方程式和不等式約束來進行求解。 --- ### ==Autolayout 的原理就是一個線性方程的解析器,該解析器試圖找到一種可滿足其規則的幾何表達式。== --- ![](https://i.imgur.com/5a0f0tX.png) --- * Greg J. Badros and Alan Borning, “The Cassowary Linear Arithmetic Constraint Solving Algorithm: Interface and Implementation”, Technical Report UW-CSE-98-06-04, June 1998. * Greg J. Badros, Alan Borning, and Peter J. Stuckey, “The Cassowary Linear Arithmetic Constraint Solving Algorithm,” ACM Transactions on Computer Human Interaction , Vol. 8 No. 4, December 2001, pages 267-306. --- 當方程組的解 | 方程組的解 | 結果 | | -------- | -------- | |無窮多個| 會得到缺乏約束的有歧義的佈局 | | 無解 | 約束有衝突 | | ==唯一解== | 才會得到一個穩定的佈局。 | --- * 因為 Auto Layout 佈局系統在最後仍然需要通過 frame 來進行。 * 不過它相比原有的佈局系統加入了從約束計算 frame 的過程,而在這裡,我們需要了解 Auto Layout 的佈局性能如何。 --- ### 如果今天想讓 app 的 view 保持60 FPS 的刷新頻率的話? --- ### 每一幀的渲染時間 ### 1s = 1000 ms ### 1000/60 = 16.67 ms --- ### 故我們必須在 16.67 ms 之內完成包括佈局、繪製以及渲染等操作。 --- ![](https://i.imgur.com/jJgCGsQ.png) --- ![](https://i.imgur.com/xBvobmf.png) ---- ## Q&A --- ## 謝謝大家! --- ref. * https://lpd-ios.github.io/2017/04/05/FlexBox-Weex/ * https://draveness.me/layout-performance * http://www.informit.com/articles/article.aspx?p=2474236&seqNum=5 * https://juejin.im/post/5a5b8b41f265da3e4c07c0bc --- ###### tags: `iOS重要觀念`
{"metaMigratedAt":"2023-06-14T21:44:30.397Z","metaMigratedFrom":"YAML","title":"Untitled","breaks":true,"contributors":"[{\"id\":\"d538c7e8-d1fa-4710-b247-7bdb9d302ffe\",\"add\":7432,\"del\":5021}]"}
    461 views