SwiftUI 框架

在 SwiftUI App 中構建多個 Theme 一鍵簡單套用不同的 Theme

在這篇教學文章中,Pavlos 會利用一個只有一個 Text 的範例 App,帶大家為 SwiftUI App 建立多個 theme,讓 App 根據不同的 Theme 更改顏色和文本。快來一起動手實作,為你的 App 客製化自己的 Theme 吧!
在 SwiftUI App 中構建多個 Theme 一鍵簡單套用不同的 Theme
在 SwiftUI App 中構建多個 Theme 一鍵簡單套用不同的 Theme
In: SwiftUI 框架
本篇原文(標題:How to Create Multiple Themes in a SwiftUI Application)刊登於作者 Medium,由 Pavlos Simas 所著,並授權翻譯及轉載。

在這篇教學文章中,我們會看看如何為 SwiftUI App 建立多個 theme。

我們會利用一個只有一個 Text 的範例 App,它會根據不同的 Theme 更改顏色和文本。

建立 SwiftUI 專案

建立一個新專案,並選擇 SwiftUI 視圖。我們的範例 App 需要建立 4 個新檔案。

把它們命名為 ThemeManagerThemeBlueTheme、和 RedTheme。你的 File Explorer 看起來應該是這樣:

暫時不用修改 View 的 “Hello World” 文本,我們稍後會再處理。

現在,讓我們看看如何建立一個新的 Theme

首先,我們需要一個所有 Theme 都會實作的協定 (protocol),名為 Theme 協定。我們的 File 看起來應該是這樣的:

import Foundation
import SwiftUI

protocol Theme {
    var textColor: Color { set get }
    var welcomeText: String { set get }
}

範例的協定十分簡單,當中只有兩個屬性 (property),一個是 textColor,代表文本的顏色,另一個是 welcomeText,是 Text 的字串 (string)。

建立好協定之後,讓我們來建立 BlueThemeRedTheme 吧。以下是 BlueTheme 的程式碼:

import SwiftUI

final class BlueTheme: Theme {
    var textColor: Color = .blue
    var welcomeText: String = "I have the blue theme"
}

以下就是 RedTheme 的程式碼:

import SwiftUI

final class RedTheme: Theme {
    var textColor: Color = .red
    var welcomeText: String = "I have the red theme"
}

好了,現在我們建立了兩個 theme。如你所見,BlueTheme 顏色為藍色,文本是 I have the blue theme;而 RedTheme 顏色為紅色,文本是 I have the red theme

ContentView 套用 theme 之前,我們需要建立一個 Manager 來追蹤當前的 theme,讓 App 所有實例都可以應用它們。

讓我們調用它的管理器 ThemeManager

class ThemeManager {
    static let shared = ThemeManager()
    private var theme: Theme = RedTheme() // Default theme

    public func applyTheme(theme: Theme) {
        self.theme = theme
    }

    public func getTheme() -> Theme {
        return self.theme
    }
}

ThemeManager 是一個簡單的單例 (singleton),有 getapply theme功能。為方便起見,我們將預設主題設置為 RedTheme

現在,可以把 theme 套用到 ContentView 了:

import SwiftUI

struct ContentView: View {

    init() {
        self.applyBlueTheme()
    }

    var body: some View {
        let theme = ThemeManager.shared.getTheme()
        Text(theme.welcomeText)
            .foregroundColor(theme.textColor)
            .padding()
    }

    private func applyBlueTheme() {
        ThemeManager.shared.applyTheme(theme: BlueTheme())
    }
}

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

init 方法內建立視圖之前,我們需要先調用 applyBlueTheme 函式,然後函式會調用 manager,並設置 BlueTheme 為當前的 theme。

之後,設置數值的步驟就十分簡單。

在構建視圖時,我們會從之前創建的 theme.welcomeText 中取得文本、並從 theme.textColor 中取得顏色。

如果我們想顯示紅色的文本,只要從 BlueTheme 轉到 RedTheme 就可以了!讓我們看看實作的結果吧:

這篇文章到此為止。謝謝你的閱讀。

本篇原文(標題:How to Create Multiple Themes in a SwiftUI Application)刊登於作者 Medium,由 Pavlos Simas 所著,並授權翻譯及轉載。
作者簡介:Pavlos Simas,iOS 開發者,對開發、行銷和金融非常有興趣。如果你有興趣閱讀我的其他文章,可以在 Medium 上訂閱。
譯者簡介:Kelly Chan-AppCoda 編輯小姐。

作者
AppCoda 編輯團隊
此文章為客座或轉載文章,由作者授權刊登,AppCoda編輯團隊編輯。有關文章詳情,請參考文首或文末的簡介。
評論
更多來自 AppCoda 中文版
iOS 18 新API:使用 Navigation Transition 創建 Hero 動畫式過場
SwiftUI 框架

iOS 18 新API:使用 Navigation Transition 創建 Hero 動畫式過場

Apple 的工程師可能早已認識到,許多 iOS 開發者都希望能夠重現 App Store 應用程式中的優雅 Hero 動畫。由於從頭實現這種動畫通常需要耗費大量時間與精力,Apple 在 iOS 18 SDK 中納入了這項功能。 透過這次更新,你現在只需少量的程式碼就能在自己的應用程式中實現類似的動畫過渡效果。這項重大改進讓開發者能夠創造出更具視覺吸引力且流暢的過渡效果,
如何使用 Vision APIs 從圖像中辨識文字
AI

如何使用 Vision APIs 從圖像中辨識文字

Vision 框架長期以來一直包含文字識別功能。我們已經有詳細的教程,向你展示如何使用 Vision 框架掃描圖像並執行文字識別。之前,我們使用了 VNImageRequestHandler 和 VNRecognizeTextRequest 來從圖像中提取文字。 多年來,Vision 框架已經顯著演變。在 iOS 18 中,Vision
iOS 18更新:SwiftUI 新功能介紹
SwiftUI 框架

iOS 18更新:SwiftUI 新功能介紹

SwiftUI的技術不斷演進,每次更新都讓 iOS 應用程式開發變得更加便捷。隨著 iOS 18 Beta 的推出,SwiftUI 引入了多個令人興奮的新功能,使開發者僅需幾行程式碼即可實現出色的效果。 本教學文章旨在探索這個版本中的幾項主要改進,幫助你了解如何運用這些新功能。 浮動標籤列 (Floating Tab Bar)SwiftUI中的標籤視圖(Tab
很好! 你已成功註冊。
歡迎回來! 你已成功登入。
你已成功訂閱 AppCoda 中文版 電子報。
你的連結已失效。
成功! 請檢查你的電子郵件以獲取用於登入的連結。
好! 你的付費資料已更新。
你的付費方式並未更新。