根据我的理解,在SwiftUI中样式化一个按钮,你需要扩展ButtonStyle
并实现func makeBody(configuration: Self.Configuration) -> some View
方法,在其中开始对configuration.label
进行修改,这是一个指向Button
视图的引用。
此外,除了label
字段之外,ButtonStyle.Configuration
还有一个布尔字段isPressed
,但这似乎就是全部。
那么我该如何检查按钮的启用或禁用状态呢?
例如,我想在按钮周围绘制边框,并且我希望如果按钮启用则边框为蓝色,如果禁用则为灰色。
我的第一个猜测是这样的:
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
.overlay(
RoundedRectangle(cornerRadius: 4).stroke(configuration.isEnabled ? Color.blue : Color.gray, lineWidth: 1).padding(8)
)
}
但是没有isEnabled
字段。
苹果提供的PlainButtonStyle
显然可以访问此信息,因为在声明它的头文件中的文档注释中说:“该样式可以应用视觉效果以指示按钮的按下、聚焦或启用状态。”
/// A `Button` style that does not style or decorate its content while idle.
///
/// The style may apply a visual effect to indicate the pressed, focused,
/// or enabled state of the button.
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
public struct PlainButtonStyle : PrimitiveButtonStyle {
.....
有没有办法访问这些信息?
编辑:
在您建议关闭此问题之前,请阅读以下内容:
一段时间以前也有一个类似的问题,但那个问题没有指定任何上下文。
这次我有一个具体的上下文:创建一个通用可重用的按钮样式。
那里提供的答案不足够。我不能期望人们将禁用状态传递给样式构造函数。这会导致太多的重复劳动。
你能想象如果人们必须这样编写代码:
Button() { .... }.disabled(someExprssion).buttonStyle(MyCustomStyle(disabled: someExpression))
很明显这是不可取的。
同时很明显,苹果提供的样式可以在不需要人们再次传递禁用状态的情况下访问该信息。
如果您关闭了该问题,则将永远防止任何人在 StackOverflow 上为此问题提供有用的答案。
请重新考虑在提出关闭建议之前。
编辑2:
我猜如果您可以获取Button
视图的EnvironmentValues.isEnabled
,那么它可能是正确的值。
因此,另一个提问的方式是:在 SwiftUI 中是否有可能获取您没有自己定义的视图的环境?