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)

使用maxWidthmaxHeight與使用widthheight不同——我們並不是說文本視圖必須佔用所有空間或者是只有它可以佔用。如果周圍還有其他視圖,SwiftUI將確保它們都獲得足夠的空間。

默認情況下,您的視圖不會離開安全區域,但您可以通過使用edgeIgnoringSafeArea()修飾符來更改它,如下所示:

Text("Hello World")      .frame(maxWidth: .infinity, maxHeight: .infinity)      .background(Color.red)      .edgesIgnoringSafeArea(.all)
效果對比