第 60 章
使用 TextRenderer 創造視覺化文字效果

Apple 在 iOS 18 中推出的 TextRenderer API,為 SwiftUI 開發者在文字處理能力方面帶來了一個顯著的飛躍。這個強大的新工具開啟了創建動態、視覺上引人注目的文字效果的可能性,這些效果過去難以實現。

TextRenderer 的核心在於,它為開發者提供了前所未有的控制權,能掌控 SwiftUI 中文字的渲染過程。通過允許在字元、單詞或行的層面進行自定義,TextRenderer 使開發者能夠創建流暢的動畫和獨特的視覺風格,讓應用程式的文字真正「活」起來。

在本章中,我們將探索該 API 如何幫助開發者創造令人印象深刻的文字效果。

TextRenderer 的基礎概念

TextRenderer 是一個協定,你可以實作它來修改 SwiftUI 中 Text 視圖的繪製方式。它讓你可以控制渲染過程,從而對文字應用自定義效果、動畫等。

讓我們從一個簡單的範例開始:

struct SimpleTextRenderer: TextRenderer {

    func draw(layout: Text.Layout, in context: inout GraphicsContext) {

        for (index, line) in layout.enumerated() {
            context.opacity = (index % 2 == 0) ? 0.4 : 1.0
            context.translateBy(x: 0, y: index % 2 == 0 ? -15 : 15)

            context.draw(line)
        }
    }
}

我們的目標是建立一個自定義的文字渲染器,交替改變文字行的透明度和垂直位置。奇數行的透明度將比偶數行低,此外,行的位置將根據其在文字中的位置向上或向下移動。

為了實現這個效果,我們將創建一個struct,並遵循 SwiftUI 的 TextRenderer 協定。此協定要求實作 draw 函數,這個函數包含我們自定義的文字渲染邏輯。

draw 函數是我們自定義文字渲染的地方。它通過 layout 參數提供對文字佈局資訊的訪問,並通過 context 參數提供繪圖上下文。

我們的實作會遍歷每一行文字。我們使用 index 來追蹤行號,並使用 line 變數來保存當前行的內容。偶數行將設置為 40% 的透明度並向上移動 15 點,而奇數行將保持完全不透明並向下移動 15 點。最後,使用 context.draw(line) 以計算出的透明度和位置繪製每一行。

為了使用 SimpleTextRenderer,你可以這樣更新 ContentView

struct ContentView: View {
    var body: some View {
        Text("This guide aims to explore every new feature and improvement in iOS 26, offering a comprehensive overview of the changes.")
            .font(.largeTitle.bold())
            .textRenderer(SimpleTextRenderer())
            .padding()
    }
}

你可以將 textRenderer 修飾器附加到 Text 視圖,並傳入一個 SimpleTextRenderer 實例。在預覽中,文字應該顯示如下圖所示的效果。

圖 1. 使用簡單文字渲染器
圖 1. 使用簡單文字渲染器

要為文字的第一行添加下劃線,我們可以增強 SimpleTextRenderer 中的 draw 函數。以下是我們可以修改的方式:

想更深入學習SwiftUI和下載完整程式碼?你可以從 AppCoda網站購買《精通 SwiftUI》完整電子版。

results matching ""

    No results matching ""