元のドキュメント: developer.apple.com/documentation/swiftui/applying-liquid-glass-to-custom-views


記事


カスタムビューにリキッドガラスを適用する


リキッドガラス効果を使用して、ビューを構成、結合、および変形します。



概観


Apple プラットフォームのインターフェースには、ガラスの光学特性と流動性を兼ね備えた新しいダイナミックな素材「Liquid Glass」が採用されています。Liquid Glass は、背後のコンテンツをぼかし、周囲のコンテンツの色や光を反射し、タッチやポインター操作にリアルタイムで反応する素材です。SwiftUI の標準コンポーネントは Liquid Glass (リキッドガラス) を使用しています。カスタムコンポーネントに Liquid Glass を採用することで、独自のアニメーションや遷移を用いて、コンポーネントを移動、結合、変形させることができます。



Liquid Glass の詳細やその他については、ランドマーク:リキッドガラスを使ったアプリ開発 をご覧ください。


リキッドガラス効果を適用して構成する


glassEffect(_:in:) 修飾子を使用して、ビューにリキッドガラス効果を追加します。デフォルトでは、この修飾子は Glassregular バリアントを使用し、ビューのコンテンツの背後にある Capsule 形状内に指定された効果を適用します。


効果を構成することで、コンポーネントをさまざまな方法でカスタマイズできます。


  • アプリ内のカスタムコンポーネント全体で統一感のある見た目と操作感を実現するには、異なる形状を使用しましょう。例えば、CapsuleCircle では不自然に見えるような大きめのコンポーネントに効果を適用する場合は、角丸長方形を使用するのが適切です。

  • 目立つように tint 色を設定することもできます。

  • カスタムコンポーネントに `interactive(_:)` を追加すると、タッチ操作やポインタ操作に反応するようになります。これにより、glass 効果と同様の応答性と滑らかな動きが標準ボタンにも適用されます。

  • 以下の例では、ビューに Liquid Glass 効果を適用する方法、特定の角半径を持つ代替形状を使用する方法、インタラクティブ操作に反応する tint 色付きビューを作成する方法をご覧ください。




    ここのビデオについては こちら をご覧下さい。


    Text("Hello, World!")
        .font(.title)
        .padding()
        .glassEffect()
    
    Text("Hello, World!")
        .font(.title)
        .padding()
        .glassEffect(in: .rect(cornerRadius: 16.0))
    
    Text("Hello, World!")
        .font(.title)
        .padding()
        .glassEffect(.regular.tint(.orange).interactive())
    


    リキッドガラスコンテナと複数のビューを組み合わせる


    複数のビューにリキッドガラス効果を適用する場合は、GlassEffectContainer を使用すると最高のレンダリングパフォーマンスが得られます。コンテナを使用すると、リキッドグガラス効果が適用されたビューの形状をブレンドしたり、遷移中に互いを変形したりすることもできます。コンテナ内では、glassEffect(_:in:) 修飾子が適用された各ビューは、その背後に効果が適用された状態でレンダリングされます。


    コンテナの間隔をカスタマイズすることで、ビューの背後にあるリキッドガラス効果の相互作用を制御できます。コンテナの間隔の値が大きいほど、ビューの背後にあるリキッドガラス効果がより早くブレンドされ、遷移中に形状が融合します。コンテナの間隔の値が、内部の HStackVStack、またはその他のレイアウトコンテナの間隔よりも大きい場合、ビュー同士が近すぎるため、静止状態でリキッドガラス効果がブレンドされます。ビューをアニメーション・インまたはアウトすると、コンテナ内のスペースの変化に応じて形状が分離または結合します。


    glassEffect(_:in:) 修飾子は、レンダリングのためにコンテナに送信するコンテンツをキャプチャします。glassEffect(_:in:) 修飾子は、ビューの外観に影響を与える他の修飾子の後に適用してください。


    以下の例では、2 つの画像が互いに近接して配置され、リキッドガラス効果によってそれらの形状が融合し始めます。これにより、コンテナ内でコンポーネントが互いに動き回ることで、流動的なアニメーションが生成されます。



    GlassEffectContainer(spacing: 40.0) {
        HStack(spacing: 40.0) {
            Image(systemName: "scribble.variable")
                .frame(width: 80.0, height: 80.0)
                .font(.system(size: 36))
                .glassEffect()
    
            Image(systemName: "eraser.fill")
                .frame(width: 80.0, height: 80.0)
                .font(.system(size: 36))
                .glassEffect()
    
                // An `offset` shows how Liquid Glass effects react to each other in a container.
                // Use animations and components appearing and disappearing to obtain effects
                // that look purposeful.
                .offset(x: -40.0, y: 0.0)
        }
    }
    

    場合によっては、コンテンツが静止している場合でも、複数のビューの幾何を単一の Liquid Glass 効果カプセルに反映させたいことがあります。glassEffectUnion(id:namespace:) 修飾子を使用して、特定の ID を持つビューが統合された効果に反映されるように指定します。これにより、類似する形状、Liquid Glass 効果、および ID を持つすべての効果が、適用された Liquid Glass の素材を持つ単一の形状に結合されます。これは、ビューを動的に作成する場合や、HStackVStack などのレイアウト コンテナの外にあるライブビューを作成する場合に特に便利です。



    let symbolSet: [String] = ["cloud.bolt.rain.fill", "sun.rain.fill", "moon.stars.fill", "moon.fill"]
    
    GlassEffectContainer(spacing: 20.0) {
        HStack(spacing: 20.0) {
            ForEach(symbolSet.indices, id: \.self) { item in
                Image(systemName: symbolSet[item])
                    .frame(width: 80.0, height: 80.0)
                    .font(.system(size: 36))
                    .glassEffect()
                    .glassEffectUnion(id: item < 2 ? "1" : "2", namespace: namespace)
            }
        }
    }
    

    遷移時のリキッドガラス状変形の効果


    変形効果は、Liquid Glass 効果を持つビュー間の遷移またはアニメーション中に発生します。コンテナ内の効果を持つビュー間の遷移は、glassEffectID(_:in:) 修飾子を使用して調整します。GlassEffectTransition を使用すると、コンテナ内で効果を追加または削除する場合に使用する遷移の種類を指定できます。コンテナに割り当てられた間隔内に配置された効果を追加または削除したい場合、デフォルトの遷移タイプは matchedGeometry です。


    よりシンプルな遷移を使用したい場合、またはカスタムの遷移を作成したい場合は、materialize 遷移と withAnimation(_:_:) を使用してください。コンテナに割り当てられた間隔よりも離れた効果を追加または削除したい場合は、materialize 遷移を使用してください。一貫した体験をユーザーに提供するには、アプリ全体で matchedGeometrymaterialize トランジションを使用してください。このシステムは、使用可能な遷移タイプで不透明度の変更以外にも多くのものを適用します。


    各リキッドガラス効果には、Namespace プロパティラッパーが提供する名前空間内の一意の識別子を関連付けます。これらの ID により、ビュー階層の変更によって形状が表示または非表示になった際に、SwiftUI が同じ形状を正しくアニメーション化することが保証されます。SwiftUI は、効果コンテナに提供された間隔と形状自体の幾何を使用して、どの形状に変形するか、またどの形状から変形するかを判断します。


    glassEffectID(_:in:) および glassEffectTransition(_:) 修飾子は、ビュー階層の遷移またはアニメーション中にのみ、そのコンテンツに影響を与えます。


    以下の例では、isExpanded 変数が変更されると、消しゴムの画像が鉛筆の画像に切り替わり、鉛筆の画像が消しゴムに切り替わります。GlassEffectContainer の間隔は 40.0 で、その中の HStack の間隔も 40.0 です。これにより、消しゴムの最も近い端がコンテナの間隔以下になったときに、消しゴムの画像が鉛筆の画像に変化します。




    ここのビデオについては こちら をご覧下さい。


    @State private var isExpanded: Bool = false
    @Namespace private var namespace
    
    var body: some View {
        GlassEffectContainer(spacing: 40.0) {
            HStack(spacing: 40.0) {
                Image(systemName: "scribble.variable")
                    .frame(width: 80.0, height: 80.0)
                    .font(.system(size: 36))
                    .glassEffect()
                    .glassEffectID("pencil", in: namespace)
    
                if isExpanded {
                    Image(systemName: "eraser.fill")
                        .frame(width: 80.0, height: 80.0)
                        .font(.system(size: 36))
                        .glassEffect()
                        .glassEffectID("eraser", in: namespace)
                }
            }
        }
    
        Button("Toggle") {
            withAnimation {
                isExpanded.toggle()
            }
        }
        .buttonStyle(.glass)
    }
    

    Liquid Glass 効果使用時のパフォーマンスを最適化する


    Liquid Glass 効果コンテナを多数作成し過ぎたり、コンテナ外のビューに効果を多数適用し過ぎたりすると、パフォーマンスが低下する可能性があります。画面上で同時に使用する Liquid Glass 効果の数を制限してください。また、アプリの使用状況に応じてレンダリング時間の使い方を最適化してください。UI のパフォーマンスを向上させる方法については、 UIアニメーションの滞りおよびレンダーループに対する検討 および InstrumentsによるSwiftUIのパフォーマンス最適化 を参照してください。





    リキッドガラスを使ったスタイリングビュー


    {}ランドマーク:リキッドガラスを使ったアプリ開発

    システム標準搭載のリキッドガラスとカスタムリキッドガラスで、アプリのユーザーエクスペリエンスを向上させましょう。


    func glassEffect(Glass, in: some Shape) -> some View

    ビューにリキッドガラス効果を適用します。


    func interactive(Bool) -> Glass

    対話型に構成された構造体のコピーを返します。


    struct GlassEffectContainer

    複数のリキッドガラスの形状を組み合わせて単一の形状にし、個々の形状同士を変形させることができるビュー。


    struct GlassEffectTransition

    ビュー階層からガラス効果が追加または削除された際に適用される変更を記述する構造。


    struct GlassButtonStyle

    ボタンの設置場所に応じてガラスの縁取りのアートワークを適用するボタンのスタイル。


    struct GlassProminentButtonStyle

    ボタンの設置場所に応じて、目立つガラスの縁取りのアートワークを施したボタンのスタイル。


    struct DefaultGlassEffectShape

    ガラス効果によってデフォルトで適用される形状は、カプセルです。














    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ