---
# System prepended metadata

title: Interview Questions - Auto Layout

---

# Interview Questions - Auto Layout

### 31. What is Intrinsic Size for UI component in iOS?
有些view可以根據裡頭呈現的內容，自動有天生的大小(natrual size)，比如說
- Label 或 Button 的固有內容尺寸取決於所顯示的文本數和所使用的字型
- 空的 ImageView 沒有固有內容尺寸，直到添加圖片後，其固有內容尺寸將設置為圖片的尺寸
- TextView 的固有內容尺寸取決於其內容，是否啟用滾動以及應用於視圖的其他約束。例如，在啟用滾動的狀況下，視圖沒有固定內容尺寸，但在禁用滾動的狀況下，默認情況下，視圖的固有內容尺寸是根據文字的尺寸計算的


### 32. 試解釋 Auto Layout 的機制。
- Auto Layout是一個以約束條件為基礎的佈局系統（constraint-based layout system），透過使用一系列的約束定義你的使用者介面，約束通常表示兩個 View 之間的關係，然後 Auto Layout 根據這些約束計算每個 View 的位置和尺寸，使其能夠產生動態響應內部和外部變化的佈局，可以依照螢幕的尺寸以及裝置的方向來調整。
- 外部變化
    - 使用者調整視窗（window）尺寸。（OS X）
    - 使用者在 iPad 上進入或離開的分割顯示（Split View）
    - 設備旋轉
    - 通話和錄音欄的出現或消失
    - 支持不同的尺寸類別（size classes）
    - 支持不同的螢幕尺寸
- 內部變化
    - APP 支持國際化、多國語系
    - APP 顯示的內容產生變化
    - APP 支持動態類別
>阿拉伯文、希伯來文書寫方式從右到左且考量單字是連續書寫，只有遇到斷句才間隔
>中文、日文與英文相同，橫寫時通常從左到右，但屬於方塊字，所以所需空間較窄，並須注意標點符號的全半形

- constraints可以設置兩個View之間的：
    - x,y 置中
    - 靠上下左右
    - 倍數、常數

### 33. Auto Layout 中，priority 的功能是什麼?
- 每個constraints都有一個priority，從0-1000，預設是1000，也可以讓開發者自訂，數值越高優先序越高
    - .required = 1000
    - .defaultHigh = 750
    - .defaultLow = 250
    - .fittingSizeLevel = 50
- 任何約束的優先序只要 < 1000，就會被視為optional，當系統無法滿足所有約束的時候可以被打破，但系統還是會盡可能的滿足其約束條件，影響layout。
- 比如superView寬 200，子視圖 UIView的左邊距離superView左邊50，UIView的右邊距離superView右邊 <=50，此時如果設定UIView的寬度為300，優先序 < 1000，則寬度會是 100，盡可能的滿足此約束
![](https://i.imgur.com/Mu2fjBT.png)


### 34. Auto Layout 中，content hugging priority 的功能是什麼?
![](https://i.imgur.com/EIjJxI5.png)
Content hugging是指會將視圖向內拉，使其貼緊其內容，比如label的邊邊貼緊text
content hugging priority是用來決定視圖向內拉的優先度，view的priority數值大的會優先執行（往內推）
比如說有兩個label在同一個橫向的stackView裡，且空間大於內容尺寸的時候，content hugging  priority大的label會優先讓該label貼緊內容


### 35. Auto Layout 中，content compression resistance priority 的功能是什麼? 
Compression resistance是指將視圖向外推，使其不會被裁剪內容
content compression resistance priority用來決定視圖向外推的優先度，view的priority數值大的會優先執行（向外推）
比如說有兩個label在同一個橫向的stackView裡，且內容大於所擁有的空間的時候，content compression resistance priority大的label會優先讓該label顯示所有的內容

### 36. 使用 Auto Layout 跟 Frame 來設定畫面，有什麼差別?
- Frame
    - 是相對於 Super View 的位置和大小，設定畫面的時候要去定義相對於Super View的原點、高、寬
    - 畫面裡面每個View都要各別去定義原點、高、寬，而且如果發生改變時，也要自己去重新計算所有受到改變影響的View的frame
        - 所以以比較基本的適應所有裝置尺寸大小這件事來說，會需要花滿大的力氣才能達到
    - 為了改善這個問題，出現了 Autoresizing Masks，定義當Super View的frame改變時view的 frame如何相對應的改變。但是只能用來因應外部改變，並不支援內部改變的情況
        - 補充：如果`translatesAutoresizingMaskIntoConstraints` 是 true的話，會將frame的設定轉成constraints來達成適應裝置的效果（所以如果要自定義位置跟大小的話，要記得設成false）
- AutoLayout
    - 相對於Frame是定義每個View的位置大小，AutoLayout設定畫面時的重點是透過設定約束來達到設定元件間的關係，進而設定View的位置和大小，會根據外部和內部變化而適應改變

### 37. 說明並比較 layoutIfNeeded、layoutSubviews、setNeedsLayout 的差別。 
- layoutSubviews()
    - 用你設定的constraints來畫subviews的位置跟大小。subclass可以 override這個方法，讓他在調整subview layout的時候按照我們想要的執行
    - **不能直接呼叫這個方法**，這個方法會在旋轉螢幕、滑動、改變subview時被觸發。
    - 或是透過setNeedsLayout()和layoutIfNeeded()來觸發layoutSubviews()
- setNeedsLayout()
    - 在main thread上呼叫這個方法，跟系統說想要重新佈局，讓那個當前的layout失效，然後在下一個更新畫面的cycle中更新layout
    - 是異步asynchronous的方法，因為方法執行完以後並沒有馬上更新layout
        - 因為渲染畫面滿花效能的，所以這樣做可以有更好的效能表現
- layoutIfNeeded()
    - 立即重新layout subview
    - 是同步synchronous的方法，因為執行完以後馬上更新layout


### 38. 說明並比較 Auto Layout 參考 UIViewController Root View 與參考 SafeAreaLayoutGuide 的差別。



### 39. 如果 app 要支援 Portrait、Landscape、iPhone + iPad，iOS 有哪些方法或工具可以幫助你完成這件事?


資料參考：
[How Auto Layout Works: A Conceptual Guide](https://medium.com/compass-true-north/a-conceptual-guide-to-auto-layout-e41d7a0c4c2b)

[Understanding Auto Layout](https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/index.html)

[iOS swift — setNeedsLayout vs layoutIfNeeded vs layoutSubviews()](https://abhimuralidharan.medium.com/ios-swift-setneedslayout-vs-layoutifneeded-vs-layoutsubviews-5a2b486da31c)