如果在swiftUI中禁用了按钮,如何更改按钮的背景色

时间:2020-07-01 13:46:31

标签: swiftui

如果按钮被禁用,我试图创建一个具有不同背景颜色的buttonStyle。

我该怎么做? 我已经创建了下面的代码来对自己介绍的变量做出反应,但是是否有可能对按钮.disabled()状态做出反应?

我的代码:

struct MyButtonStyle: ButtonStyle {
    var enabledState = false

    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            .foregroundColor(Color.white)
            .padding(10)
            .padding(.horizontal, 20)
            .background(self.enabledState ? Color(UIColor.orange) : Color(UIColor.lightGray))
            .cornerRadius(20)
            .frame(minWidth: 112, idealWidth: 112, maxWidth: .infinity, minHeight: 40, idealHeight: 40, maxHeight: 40, alignment: .center)
            .scaleEffect(configuration.isPressed ? 0.9 : 1.0)
    }
}

struct ContentView: View {
    @State private var buttonEnabled = false

    var body: some View {
        HStack {
            Button("Button") {
                self.buttonEnabled.toggle()
                print("Button pressed")
            }
        }
        .buttonStyle(MyButtonStyle(enabledState: self.buttonEnabled))
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

2 个答案:

答案 0 :(得分:1)

要跟踪background-image,有.disabled会显示此状态。但是环境值仅适用于视图,而不能在样式上起作用。

因此解决方案是创建跟踪isEnabled的自定义按钮,并将其传递给自己的样式。

以下是解决方案方法的演示(EnvironmentValues.isEnabled不变)。经过Xcode 12b测试。

MyButtonStyle

答案 1 :(得分:0)

再次使用 Environment.isEnabled,但这次使用的是 ViewModifier。这样做的好处是您可以在其他视图上使用它,而不仅仅是按钮。此实现降低了按钮背景颜色的不透明度,因此无需注入新样式。

struct MyButtonModifier: ViewModifier {
    @Environment(\.isEnabled) var isEnabled
    let backgroundColor: Color

    func body(content: Content) -> some View {
        content
            .background(backgroundColor.opacity(isEnabled ? 1 : 0.5))
    }
}

然后在你的代码中使用它

Button("foo") {
    // action
}
.modifier(MyButtonModifier(backgroundColor: Color.red))