Try   HackMD

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,盡可能的滿足此約束
    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()