SwiftUIでTextのマスク処理

開発環境

> xcodebuild -version
Xcode 14.0
Build version 14A5228q

Xcodeはbetaだが本記事の内容はiOS16未満のAPIを使用。

モチベーション

マスク処理やってみたいけどパッと実装が思いつかなかったので書いてみる。

お題

https://youtu.be/j3INdAPAO0o?t=6

方針

LinearGradientでグラデーションを作って、mask(alignment:_:)としてTextを指定する。maskはiOS15.0からの登場ということで比較的新しいAPI

コード

import SwiftUI

struct ContentView: View {
    var body: some View {
        LinearGradient(
            colors: [
                .orange,
                .pink,
                .purple,
                .blue,
                .cyan
            ],
            startPoint: .leading,
            endPoint: .trailing
        ).frame(width: UIScreen.main.bounds.width / 1.5)
            .mask {
                Text("輝きたい。")
                    .font(.system(size: 50, design: .serif))
            }
    }
}

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

実行結果

欲を言えば斜体にしたかったのだが、italic() が効かなかった。日本語に対しては設定されてないみたい。

アルファベットなら斜体になる

所感

結構簡単にできた。サイズの計算だけもう少しちゃんと書きたい。Textの幅に応じてLinerGradientの幅を決めたい。今の所実装方法思いついてないけど、GeometryReaderを使えばいけそう?GeometryReader自体少ししか触ってなく、使い方忘れたので書いていく。

参考