swiftuicolor-picker

How can I change layout of apple ColorPicker from Circle to Square in SwiftUI?


The default button style of ColorPicker is a circle as bellow.

enter image description here

I want to change the style of the circle button to Rectangle. But seems no API can change it style. So I put a Rectangle over it , and set it allowsHitTesting to false to transport click event to ColorPicker.

enter image description here

struct ColorPickerView: View {
    @State private var colorValue = Color.orange
    var body: some View {
        ZStack() {
            ColorPicker("", selection: $colorValue)
                .labelsHidden()
            Rectangle()
                .foregroundColor(.blue)
                .frame(width: 40, height: 40, alignment: .center)
                .allowsHitTesting(false)
        }
    }
}

But the ColorPicker did not present after click.

I put a circle bellow the Rectangle to test whether allowsHitTesting is useful. It can work properly responding to tap gesture to print "Circle tapped!".

struct ColorPickerView: View {
    @State private var colorValue = Color.orange
    var body: some View {
        ZStack() {
            ColorPicker("", selection: $colorValue)
                .labelsHidden()
            Rectangle()
                .foregroundColor(.blue)
                .frame(width: 40, height: 40, alignment: .center)
                .onTapGesture {
                    print("Circle tapped!")
                }
            Rectangle()
                .foregroundColor(.blue)
                .frame(width: 40, height: 40, alignment: .center)
                .allowsHitTesting(false)
        }
    }
}

Why the ColorPicker can not responding to tap gesture? Or Is there a way to customize the ColorPicker button?


Solution

  • Simply use opacity, and send the ColorPicker to overlay, like in the code:


    enter image description here

    struct SquareColorPickerView: View {
        
        @Binding var colorValue: Color
        
        var body: some View {
            
            colorValue
                .frame(width: 40, height: 40, alignment: .center)
                .cornerRadius(10.0)
                .overlay(RoundedRectangle(cornerRadius: 10.0).stroke(Color.white, style: StrokeStyle(lineWidth: 5)))
                .padding(10)
                .background(AngularGradient(gradient: Gradient(colors: [.red,.yellow,.green,.blue,.purple,.pink]), center:.center).cornerRadius(20.0))
                .overlay(ColorPicker("", selection: $colorValue).labelsHidden().opacity(0.015))
                .shadow(radius: 5.0)
    
        }
    }
    

    Use case:

    struct ContentView: View {
        
        @State private var colorValue = Color.orange
        
        var body: some View {
    
            SquareColorPickerView(colorValue: $colorValue)
    
        }
    }