代码之家  ›  专栏  ›  技术社区  ›  Richard Topchii

SwiftUI按钮样式忽略iOS 14.4上的isEnabled环境变量,适用于iOS 14.5+

  •  1
  • Richard Topchii  · 技术社区  · 3 年前

    我有以下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版本中预览相同的代码时,我得到了完全不同的结果: enter image description here enter image description here

    iOS 14.4,Xcode 12.2-不正确

    enter image description here

    iOS 14.5,Xcode 12.5.1-正确

    enter image description here

    请注意,在这两种情况下,禁用时按钮都不会对更改做出反应。在iOS 14.4上,它看起来已经启用,但无法按下它。

    看起来 @Environment(\.isEnabled) 值被忽略,并简单地默认为 true . 我也有类似的问题 @Environment(\.horizontalSizeClass) 它表现得好像在哪里 nil ,不是 .regular 而不是 .compact 。对于iOS 14.5,这个错误已经修复,但如何将其“后移植”到iOS 14.4?

    1. iOS 14.4和iOS 14.5之间出现这种不一致行为的原因是什么?
    2. 在我的代码中有什么原因可能导致它吗?
    3. iOS 14.4上有解决方案吗?
    4. 如果是SwiftUI错误,是否可以重写的代码 PrimaryButton 在某种程度上,按钮仍然可以反映其状态(启用/禁用)的变化。
    0 回复  |  直到 3 年前