8. 動態生成預覽
接下來,我們會在 LandmarkList_Previews 中添加代碼以在不同的設備尺寸上渲染列表。默認情況下,預覽會以當前的 scheme 中設備的大小進行渲染。我們可以通過調用 previewDevice(_:) 方法來改變預覽設備。SwiftUI官方教程

8.1 首先,改變當前 list 的預覽來顯示 iPhone SE 的尺寸。
我們可以輸入任何 Xcode scheme 菜單中顯示的設備名稱。
LandmarkList.swift
import SwiftUI
struct LandmarkList: View {
var body: some View {
NavigationView {
List(landmarkData) { landmark in
NavigationButton(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
.navigationBarTitle(Text("Landmarks"))
}
}
}
struct LandmarkList_Previews: PreviewProvider {
static var previews: some View {
LandmarkList()
.previewDevice(PreviewDevice(rawValue: "iPhone SE"))
}
}

8.2 在 list 預覽中用設備名稱數組作為數據,將 LandmarkList 嵌入到 ForEach 實例中。SwiftUI教程
ForEach 以與 list 相同的方式對集合進行操作,這樣我們就可以在任何可以使用子視圖的地方使用它,比如 stacks , lists ,groups 等。當數據元素像這里使用的字符串一樣是簡單的值類型時,我們可以使用 \.self 作為標識符的 key path 。
LandmarkList.swift
import SwiftUI
struct LandmarkList: View {
var body: some View {
NavigationView {
List(landmarkData) { landmark in
NavigationButton(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
.navigationBarTitle(Text("Landmarks"))
}
}
}
struct LandmarkList_Previews: PreviewProvider {
static var previews: some View {
ForEach(["iPhone SE", "iPhone XS Max"].identified(by: \.self)) { deviceName in
LandmarkList()
.previewDevice(PreviewDevice(rawValue: deviceName))
}
}
}

8.3 使用 previewDisplayName(_:) 方法把設備名稱作為 labels 添加到預覽中。SwiftUI教程
LandmarkList.swift
import SwiftUI
struct LandmarkList: View {
var body: some View {
NavigationView {
List(landmarkData) { landmark in
NavigationButton(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
.navigationBarTitle(Text("Landmarks"))
}
}
}
struct LandmarkList_Previews: PreviewProvider {
static var previews: some View {
ForEach(["iPhone SE", "iPhone XS Max"].identified(by: \.self)) { deviceName in
LandmarkList()
.previewDevice(PreviewDevice(rawValue: deviceName))
.previewDisplayName(deviceName)
}
}
}

8.4 我們可以在 canvas 中體驗不同的設備,對比它們在渲染 view 時的差異。

