如果按钮被禁用,我试图创建一个具有不同背景颜色的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()
}
}
答案 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))