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之間的:
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,盡可能的滿足此約束
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
34. Auto Layout 中,content hugging priority 的功能是什麼?
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
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
Understanding Auto Layout
iOS swift — setNeedsLayout vs layoutIfNeeded vs layoutSubviews()