SwiftUI MeshGradient
SwiftUI MeshGradients offer complex gradients aligned with a grid.
import SwiftUI
@available(iOS 18.0, *)
struct SampleMeshGradientView: View {
@State private var hue: CGFloat = 0.0
@State private var points: [SIMD2] = [
[0.0, 0.0], [0.5, 0.0], [1.0, 0.0],
[0.0, 0.5], [0.9, 0.3], [1.0, 0.5],
[0.0, 1.0], [0.5, 1.0], [1.0, 1.0]
]
@State private var colors = Array(repeating: Color.white, count: 9)
@State private var timer: Timer?
var body: some View {
VStack {
HStack {
Slider(value: $hue, onEditingChanged: { flag in
withAnimation {
makeColors()
} completion: {
}
})
}
MeshGradient(
width: 3,
height: 3,
points: points,
colors: colors
)
}
.padding()
.task {
makeColors()
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { t in
withAnimation(Animation.linear(duration: 0.5)) {
let step = 0.2
hue = hue + step > 1.0 ? 0.0 : hue + step
makeColors()
} completion: {
}
})
}
}
private func makeColors() {
var colors: [Color] = []
for row in 0..<3 {
for col in 0..<3 {
colors.append(color(row: row, col: col))
}
}
self.colors = colors
}
private func color(row: Int, col: Int) -> Color {
let delta = CGFloat.random(in: -0.1 ... 0.1)
let h = max(0.0, min(1.0, (hue + delta)))
return Color(hue: h, saturation: 1.0, brightness: 1.0).opacity(0.5)
}
}
@available(iOS 18.0, *)
#Preview {
SampleMeshGradientView()
}