ios - SwiftUI ButtonStyle 在 iOS 14.4 上忽略 isEnabled 环境变量,适用于 iOS 14.5+
问题描述
我有以下 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
某种方式重写按钮仍然可以反映其状态的变化(启用/禁用)的代码。
解决方案
推荐阅读
- c - 如何使 printf 中的文本出现在 C 中的 scanf 之后?
- sql - SSIS 作业失败 - 拒绝访问平面文件
- c - 从 Int 10h/AX=4F00h 检索 VESA 视频模式列表
- swift - 如何用 CLLocationDegrees 解决这个问题?
- java - 通过在 java 中设置 cookie 进行身份验证,在浏览器中打开网页
- email - 邮件客户端发件人图片
- ios - 应用旋转为横向和纵向,但不会倒置旋转
- codeblocks - code::blocks 不会将我的设置保存为默认设置
- r - 组合两个相同/不同名称的数据框
- java - 在 java play scheduler 任务中注入一个类实例