我有以下SwiftUI
ButtonStyle
:
public struct PrimaryButton: ButtonStyle {
private let type: ButtonType
@Environment(\.isEnabled) private var isEnabled
public init() {
}
public func makeBody(configuration: Configuration) -> some View {
configuration
.label
.font(.callout)
.foregroundColor(textColor)
.padding(padding)
.background(backgroundColor)
.clipShape(RoundedRectangle(cornerRadius: 4,
style: .continuous))
.opacity(configuration.isPressed ? 0.5 : 1)
}
private var padding: EdgeInsets {
return EdgeInsets(top: 16,
leading: 16,
bottom: 16,
trailing: 16)
}
private var backgroundColor: Color {
isEnabled ? .blue : .gray
}
private var textColor: Color {
isEnabled ? Color.white : .gray
}
}
以及以下预览代码:
struct ButtonStyle_Previews: PreviewProvider {
static var previews: some View {
VStack {
SwiftUI.Button(action:{}, label: {
Text(verbatim: "Primary")
}).buttonStyle(PrimaryButton())
SwiftUI.Button(action:{}, label: {
Text(verbatim: "PrimaryDisabled")
}).buttonStyle(PrimaryButton())
.disabled(true)
}
.padding()
}
}
令人惊讶的是,当我试图在不同的iOS版本中预览相同的代码时,我得到了完全不同的结果:
iOS 14.4,Xcode 12.2-不正确
iOS 14.5,Xcode 12.5.1-正确
请注意,在这两种情况下,禁用时按钮都不会对更改做出反应。在iOS 14.4上,它看起来已经启用,但无法按下它。
看起来
@Environment(\.isEnabled)
值被忽略,并简单地默认为
true
.
我也有类似的问题
@Environment(\.horizontalSizeClass)
它表现得好像在哪里
nil
,不是
.regular
而不是
.compact
。对于iOS 14.5,这个错误已经修复,但如何将其“后移植”到iOS 14.4?
-
iOS 14.4和iOS 14.5之间出现这种不一致行为的原因是什么?
-
在我的代码中有什么原因可能导致它吗?
-
iOS 14.4上有解决方案吗?
-
如果是SwiftUI错误,是否可以重写的代码
PrimaryButton
在某种程度上,按钮仍然可以反映其状态(启用/禁用)的变化。