blog

[100日のSwiftUI】スワイプでビューに色をつける

ユーザーはカードを左右にスライドさせることで、この答えが正解か不正解かをマークすることができますが、今のところ2つの方向を視覚的に区別することはできません。出会い系アプリ「Tinder」を参考に、右ス...

Sep 13, 2020 · 3 min. read
シェア

スワイプ時の色付け

ユーザーはカードを左右にスライドさせることで、この答えが正しいか間違っているかをマークすることができますが、2つの方向を視覚的に区別することは今のところありません。出会い系アプリのTinderを参考に、良い場合は右スワイプ、悪い場合は左スワイプというように。

デフォルト設定の携帯電話では、カードは緑か赤になりますが、ユーザーが「色分けしない」設定を有効にしている場合、カードは白のままで、背景に追加のUIが追加されます。

まず、現在のカードの効果を見てみましょう:

RoundedRectangle(cornerRadius: 25, style: .continuous)
 .fill(Color.white)
 .shadow(radius: 10)

ジェスチャーの動きに合わせて背景色を緑または赤にし、ドラッグの動きに合わせて前景の塗りつぶしの白を大きくします。

まずは背景の部分です。shadow()モディファイアの直後に以下のコードを追加します:

.background(
 RoundedRectangle(cornerRadius: 25, style: .continuous)
 .fill(offset.width > 0 ? Color.green : Color.red)
)

前景の透過については、2 - 1/50 のジェスチャ幅ではなく、1 - 1/50 のジェスチャ幅を使用する点を除き、ドラッグアンドドロップによるフェードと同様に処理されます。 違いは、フェードが少なくとも50ポイントをドラッグすることでトリガーされる必要があったのに対し、移動するとすぐに色が変わるようになったことです。

fill() 修飾子を次のように置き換えてください:

.fill(
 Color.white
 .opacity(1 - Double(abs(offset.width / 50)))
)

アプリを実行すると、ドラッグ&ドロップが進むにつれて、カードが白から赤や緑に変わり、フェードインし始めるのがわかります。かっこいい!

しかし、赤緑色覚異常の人にとっては、この方式は機能しません。カードの明るさの変化が見えるだけで、左右の違いを感じることができないのです。

この問題を解決するには、色を使用するかどうかを確認するための環境プロパティを追加する必要があります:

@Environment(\.accessibilityDifferentiateWithoutColor) var differentiateWithoutColor

RoundedRectangle では、前景と背景の両方にこのテクニックを使用します。

現在の RoundedRectangle コードを次のように置き換えてください:

RoundedRectangle(cornerRadius: 25, style: .continuous)
 .fill(
 differentiateWithoutColor
 ? Color.white
 : Color.white
 .opacity(1 - Double(abs(offset.width / 50)))
 )
 .background(
 differentiateWithoutColor
 ? nil
 : RoundedRectangle(cornerRadius: 25, style: .continuous)
 .fill(offset.width > 0 ? Color.green : Color.red)
 )
 .shadow(radius: 10)

その結果、デフォルトの設定では、カードは緑か赤に変わりますが、色の区別を有効にしていない場合、この色の変化は起こりません。したがって、正しいか正しくないかを区別するために、何らかの追加UIを提供する必要があります。

このプロパティをContentViewに追加します:

@Environment(\.accessibilityDifferentiateWithoutColor) var differentiateWithoutColor

その後、VStackに以下のビューを追加します:

if differentiateWithoutColor {
 VStack {
 Spacer()
 HStack {
 Image(systemName: "xmark.circle")
 .padding()
 .background(Color.black.opacity(0.7))
 .clipShape(Circle())
 Spacer()
 Image(systemName: "checkmark.circle")
 .padding()
 .background(Color.black.opacity(0.7))
 .clipShape(Circle())
 }
 .foregroundColor(.white)
 .font(.largeTitle)
 .padding()
 }
}

この条件により、このUIは "not color-coded "が有効な場合にのみ表示されます。

支援機能が有効であるかどうかにかかわらず、すべてのユーザーが素晴らしい体験を得られるようにすることです。これは、アプリ開発者が目指すべきことです。

Read next

ウェブ開発の生産性を高める10の素晴らしいJavaScriptライブラリ

JavaScriptは最も人気のあるプログラミング言語のひとつです。プログラマーは過去20年間、その爆発的な成長を目の当たりにしてきました。現在では、ほとんどあらゆる操作が可能で、モノのインターネットを含む複数のプラットフォームやデバイス上で動作します。人気の理由のひとつは、多数のフレームワークやライブラリが利用できることです。プログラマーとして、適切なライブラリを持ち、使用することは、より...

Sep 12, 2020 · 3 min read