【发布时间】:2020-03-28 20:48:51
【问题描述】:
根据我的理解,要在 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 字段。
Apple 提供的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))
显然这是不可取的。
很明显,Apple 提供的样式可以访问信息,而无需人们再次将禁用状态传递给该样式。
如果您关闭该问题,您将永远阻止任何人在 StackOverflow 上为该问题提供有用的答案。
建议关闭前请重新考虑。
编辑2:
我猜如果你能得到Button 视图的EnvironmentValues.isEnabled 那么它可能是正确的值。
所以问这个问题的另一种方式是:在 SwiftUI 中是否有可能获得您没有定义自己的视图的环境?
【问题讨论】:
-
这表明没有办法,但显然有办法,因为内置的 PlainButtonStyle 知道?
-
不出所料,近身警察开始突袭..
-
在新建struct NewButtonStyle: ButtonStyle 时,似乎无法抓取按钮的@Environment(\.isEnabled) var isEnabled。只有在创建自定义按钮时才能访问 isEnabled 的正确值...