SwiftUI 框架

如何在 SwiftUI 使用 Preview Macro

如何在 SwiftUI 使用 Preview Macro
如何在 SwiftUI 使用 Preview Macro
In: SwiftUI 框架

SwiftUI 中的預覽(Preview)功能允許開發人員在不運行應用程序於設備或模擬器上的情況下,實時查看App的外觀。這個功能對於那些希望快速迭代設計並確保一切看起來和運作如預期的開發人員來說非常有用。隨著 iOS 17 中引入了巨集(Macro)的功能,預覽功能變得更加強大和靈活,提供了更多的自定義和靈活性。在本教學中,我們將探索如何在 SwiftUI 中使用新的預覽巨集(Preview Macro)以及一些令人興奮的新功能。

新的 #Preview 巨集

在引入新的 #Preview 巨集之前,你需要定義一個遵循 PreviewProvider 協議的 struct 來創建視圖的預覽。以下是一個範例:

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

有了 #Preview 巨集,你可以使用以下程式碼告訴 Xcode 建立預覽:

// The basic syntax
#Preview {
	ContentView()
}

// Configure the preview's name
#Preview("Pie Chart View") {
	PieChartView()
}

正如你所見,#Preview 簡化了我們定義預覽的方式。另外,你也可以向 #Preview 巨集傳遞一個名稱以配置預覽的名稱。

圖 1. 預覽基礎

你可以根據需要為任何視圖設置預覽。然後,Xcode將呈現預覽,該預覽將直接顯示在畫布中。

預覽多個視圖

圖 2. 預覽多個視圖

當使用 PreviewProvider 時,你可以使用 Group 嵌入多個視圖進行預覽。

struct ArticleView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            ArticleListView()
								.previewDisplayName("Article List View")
            
						ArticleView()
                .previewDisplayName("Article View")
        }
    }
}

如果你使用 #Preview 巨集,可以定義多個 #Preview 區塊。例如,要預覽 ArticleListViewArticleView,你可以創建兩個 #Preview 區塊,如下所示:

#Preview("Article List View") {
    ArticleListView()
}

#Preview("Article View") {
    ArticleView()
}

橫向方向的視圖預覽

圖 3. 橫向方向的視圖預覽

#Preview 巨集具有一個可選的 traits 參數,允許開發人員自定義模擬器的方向。要在橫向模式下預覽視圖,你可以將 .landscapeLeft.landscapeRight 傳遞給 traits 參數。以下是一個示例:

#Preview("Article List View", traits: .landscapeLeft) {
    ArticleListView()
}

固定佈局的預覽

traits 參數還可以接受另一個名為 .sizeThatFitsLayout 的值,這樣你就可以在沒有任何設備框架的情況下預覽視圖。

圖 4. 預覽視圖(沒有裝置框架)

除了 .sizeThatFitsLayout,你還可以使用 .fixedLayout 在特定大小下預覽視圖。

#Preview("Article List View", traits: .fixedLayout(width: 300, height: 300)) {
    ArticleListView()
}

編寫 UIKit 預覽

預覽功能不再僅限於 SwiftUI。即使你使用 UIKit,也可以使用 #Preview 巨集為你的 UIKit 視圖或視圖控制器設置預覽。要預覽視圖控制器,可以在程式碼區塊中實例化它:

#Preview {
    var controller = ViewController()
    
    return controller
}

如果你的視圖控制器是在故事板(storyboard)中設計的,也可以使用該巨集進行預覽。以下是一個示例程式碼:

#Preview("From Storyboard") {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    
    var controller = storyboard.instantiateViewController(withIdentifier: "ViewController")
    
    return controller
}

假設你已經為視圖控制器指定了一個故事板ID,可以使用 instantiateViewController 方法創建視圖控制器。以下是使用 #Preview 預覽 UIKit 視圖控制器的方式:

圖 5. 利用 Preview macro 預覽 UIKit 視圖

總結

SwiftUI 中的預覽功能使開發人員能夠實時查看App的外觀,而無需在設備或模擬器上運行App。在 iOS 17 中引入的 #Preview 巨集使預覽程式碼更加清晰和簡潔。它變得更加強大和靈活,允許你預覽使用 UIKit 開發的視圖。

作者
Simon Ng
軟體工程師,AppCoda 創辦人。著有《iOS 17 App 程式設計實戰心法》、《iOS 17 App程式設計進階攻略》以及《精通SwiftUI》。曾任職於HSBC, FedEx等跨國企業,專責軟體開發、系統設計。2012年創立AppCoda技術部落格,定期發表iOS程式教學文章。現時專注發展AppCoda業務,致力於iOS程式教學、產品設計及開發。你可以到推特與我聯絡。
評論
更多來自 AppCoda 中文版
很好! 你已成功註冊。
歡迎回來! 你已成功登入。
你已成功訂閱 AppCoda 中文版 電子報。
你的連結已失效。
成功! 請檢查你的電子郵件以獲取用於登入的連結。
好! 你的付費資料已更新。
你的付費方式並未更新。