# 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)