SwiftUI視圖的背後是什麼?
- 2020 年 3 月 26 日
- 筆記
剛開始使用SwiftUI時,您會獲得以下程式碼:
struct ContentView: View { var body: some View { Text("Hello World") } }
然後通常使用背景顏色修改該文本視圖並期望其充滿整個螢幕:
struct ContentView: View { var body: some View { Text("Hello World") .background(Color.red) } }
但是,這不會發生。取而代之的是,我們在螢幕中心獲得了一個小的紅色文本視圖,並在其後出現了一片白色的海洋。
這使人們感到困惑,並且通常會引發一個問題:「如何使視圖後的內容變成紅色?」
讓我儘可能清楚地說:對於SwiftUI開發人員,我們的視圖背後沒有任何東西。您不應該嘗試通過駭客或變通方法使空白變成紅色,並且也不應該嘗試在SwiftUI之外進行操作。
現在,至少現在在我們的內容視圖後面有一個名為UIHostingController
的東西:它是UIKit(蘋果公司最初的iOS UI框架)和SwiftUI之間的橋樑。但是,如果您開始嘗試進行修改,則會發現您的程式碼不再可以在Apple的其他平台上使用,實際上將來可能會完全停止在iOS上使用。
一旦有了這種想法,正確的解決方案就是使文本視圖佔用更多空間;使其充滿整個螢幕,而不是精確地圍繞其內容調整大小。我們可以通過使用frame()
修飾符來做到這一點,將.infinity
同時傳遞給它的最大寬度和最大高度。
Text("Hello World") .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.red)
使用maxWidth
和maxHeight
與使用width
和height
不同——我們並不是說文本視圖必須佔用所有空間或者是只有它可以佔用。如果周圍還有其他視圖,SwiftUI將確保它們都獲得足夠的空間。
默認情況下,您的視圖不會離開安全區域,但您可以通過使用edgeIgnoringSafeArea()
修飾符來更改它,如下所示:
Text("Hello World") .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.red) .edgesIgnoringSafeArea(.all)
