To customize the appearance of the RadialGradientPicker, create a struct that conforms to the RadialGradientPickerStyle protocol. You must implement six methods: makeGradient, makeCenter, makeStartHandle, makeEndHandle, makeStop, and makeBar.
After defining your style, apply it using the .radialGradientPickerStyle() modifier.
struct MyPickerStyle: RadialGradientPickerStyle {
func makeGradient(gradient: RadialGradient) -> some View {
RoundedRectangle(cornerRadius: 5)
.fill(gradient)
.overlay(RoundedRectangle(cornerRadius: 5).stroke(Color.white))
}
func makeCenter(configuration: GradientCenterConfiguration) -> some View {
Circle().fill(configuration.isActive ? Color.yellow : Color.white)
.frame(width: 35, height: 35)
.opacity(configuration.isHidden ? 0 : 1)
.animation(.easeIn)
}
func makeStartHandle(configuration: GradientHandleConfiguration) -> some View {
Circle()
.stroke(Color.white.opacity(0.001), style: StrokeStyle(lineWidth: 10))
.overlay(Circle().stroke(Color.black, style: StrokeStyle(lineWidth: 1, dash: [10, 5])))
.opacity(configuration.isHidden ? 0 : 1)
.animation(.easeIn)
}
func makeEndHandle(configuration: GradientHandleConfiguration) -> some View {
Circle()
.stroke(Color.white.opacity(0.001), style: StrokeStyle(lineWidth: 10))
.overlay(Circle().stroke(Color.white, style: StrokeStyle(lineWidth: 1, dash: [10, 5])))
.opacity(configuration.isHidden ? 0 : 1)
.animation(.easeIn)
}
func makeStop(configuration: GradientStopConfiguration) -> some View {
Group {
if !configuration.isHidden {
RoundedRectangle(cornerRadius: 5)
.foregroundColor(configuration.color)
.frame(width: 25, height: 45)
.overlay(RoundedRectangle(cornerRadius: 5).stroke(configuration.isSelected ? Color.yellow : Color.white))
.shadow(color: configuration.isSelected ? Color.white : Color.black, radius: 3)
.transition(AnyTransition.opacity)
.animation(Animation.easeOut)
}
}
}
func makeBar(configuration: RadialGradientBarConfiguration) -> some View {
Group {
if !configuration.isHidden {
RoundedRectangle(cornerRadius: 5)
.fill(LinearGradient(gradient: configuration.gradient, startPoint: .leading, endPoint: .trailing))
.overlay(RoundedRectangle(cornerRadius: 5).stroke(Color.white))
.transition(AnyTransition.move(edge: .leading))
.animation(Animation.easeOut)
}
}
}
}
// Usage
RadialGradientPicker()
.environmentObject(gradientManager)
.radialGradientPickerStyle(MyPickerStyle())