swift 修改自定义ButtonStyle内的形状颜色

kgsdhlau  于 2023-05-27  发布在  Swift
关注(0)|答案(2)|浏览(200)

在我的项目中,我使用自定义形状作为按钮的标签。现在,我正在尝试创建一个自定义的ButtonStyle,每当当前按下按钮时,它就会更改自定义形状的颜色。
如果我使用“正常”按钮标签,例如a Text,我可以这样做:

struct LightGrayButtonStyle: ButtonStyle {
    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            .foregroundColor(configuration.isPressed ? .black : .red)
    }
}

但是,configuration.label没有任何特定于Shape的视图修改器,因此无法使用.fill等更改颜色。
这是我的代码的其余部分:

Button {
   action()
} label: {
   RingSegment() // this is my custom shape
}
.buttonStyle(LightGrayButtonStyle()) // I apply my custom button style

我现在如何更改自定义ButtonStyle中自定义形状的颜色?或者,我如何使我的自定义形状尊重提供的foregroundColor,我可以在我的LightGrayButtonStyle实现的makeBody方法中设置它?

dgenwo3n

dgenwo3n1#

您可以移动ButtonStyle中的所有代码

struct MyShapeButtonStyle<S: Shape>: ButtonStyle {
    ///Custom Shape
    let shape: S
    ///Default Color
    let color: Color
    ///Uses any Shape
    init(shape: S, color: Color) {
        self.shape = shape
        self.color = color
    }
    ///Default is a `Circle`
    init(color: Color) where S == Circle {
        self.shape = Circle()
        self.color = color
    }
    
    func makeBody(configuration: Self.Configuration) -> some View {
        //Custom shape
        shape
            //Fill for the shape
            .fill(configuration.isPressed ? .black : color)//Keep the ability to put a label in the button
            .overlay(content: {
                //Keep the ability to have a custom label.
                configuration.label
                    .foregroundColor(.white)
            })
            .foregroundColor(configuration.isPressed ? .black : color)
    }
}

然后你可以传入任何Shape和任何Color

struct CustomButtonShapeView: View {
    var body: some View {
        VStack{
            Button("Test") {
                print("test")
            }
            .buttonStyle(MyShapeButtonStyle(color: .red))
            
            Button("Test") {
                print("test")
            }
            .buttonStyle(MyShapeButtonStyle(shape: Rectangle(), color: .blue))
        }
    }
}
pcrecxhr

pcrecxhr2#

我的解决方案是在makeBody函数中应用foregroundColor修饰符,并在填充自定义形状时使用该颜色。
这是我的代码:

// Declare Button Style
struct LightGrayRingSegmentButtonStyle: ButtonStyle {
    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            .foregroundColor(configuration.isPressed ? .red : .blue)
    }
}

Button {
    action()
} label: {
    RingSegment()
        // respect foregroundColor which we set inside the custom button style
        .fill(.foreground)
}
.buttonStyle(LightGrayRingSegmentButtonStyle())

相关问题