🪞

頑張れば使いこなせる SwiftUI grayscale の裏技

2024/02/10に公開

普通

SwiftUIの grayscale はこういうもんです。

HStack {
    Color.red
    Color.red.grayscale(0.25)
    Color.red.grayscale(0.5)
    Color.red.grayscale(0.75)
    Color.red.grayscale(1.0)
}

何かに使えそうですね。

1超え

与える値が1.0を超えると反対の色になっていきます。引き続き .red に対して指令しています。

HStack {
    Color.red.grayscale(1.0)
    Color.red.grayscale(1.25)
    Color.red.grayscale(1.5)
    Color.red.grayscale(1.75)
    Color.red.grayscale(2.0)
}

何かに使え...そう?

さらに超え

さらに値を大きくします。

HStack {
    Color.red.grayscale(3.0)
    Color.red.grayscale(4.0)
    Color.red.grayscale(5.0)
    Color.red.grayscale(6.0)
    Color.red.grayscale(7.0)
}

.red の場合は7ぐらいが限界ですな。

反対

マイナスを与えるともとの色が強くなります。.red はもともとはっきりしているので代わりに .brown でやってみます。

HStack {
    Color.brown.grayscale(0.0)
    Color.brown.grayscale(-0.5)
    Color.brown.grayscale(-1.0)
    Color.brown.grayscale(-2.0)
    Color.brown.grayscale(-3.0)
}

何かに使え...そう???

ほぼ灰色を変身させる

次の3つの色(ほぼ灰色)にgrayscaleを与えて変身させます。

ほぼ灰色

Color(red: 0.49, green: 0.49, blue: 0.51)
Color(red: 0.49, green: 0.51, blue: 0.49)
Color(red: 0.51, green: 0.49, blue: 0.49)

変身

HStack(spacing: 0) {
    ForEach(-10..<11) { index in
        Color(red: 0.49, green: 0.49, blue: 0.51)
            .grayscale(Double(index * 5))
    }
}
HStack(spacing: 0) {
    ForEach(-10..<11) { index in
        Color(red: 0.49, green: 0.51, blue: 0.49)
            .grayscale(Double(index * 5))
    }
}
HStack(spacing: 0) {
    ForEach(-10..<11) { index in
        Color(red: 0.51, green: 0.49, blue: 0.49)
            .grayscale(Double(index * 5))
    }
}
HStack(spacing: 0) {
    Text("-50.0")
    Spacer()
    Text("0.0")
    Spacer()
    Text("+50.0")
}

計算イメージ

画像はイメージです。
実際にどうなっているかは知りません。

c: 各色
g: モディファイアの引数
max(min((c - 0.5) * (1.0 - g) + 0.5, 1.0), 0.0)

Discussion