swift 使用自定义ButtonStyle破坏了可访问性ShowButtonBackground覆盖

omqzjyyz  于 2023-10-15  发布在  Swift
关注(0)|答案(2)|浏览(126)

我使用自定义ButtonStyle来改变按钮在按下状态下的颜色

Button(action: action) {
    bodyView
}
.buttonStyle(ListCellButtonStyle())

private struct ListCellButtonStyle: ButtonStyle {

    func makeBody(configuration: Configuration) -> some View {
        configuration.label
            .overlay(
                Rectangle()
                    .foregroundColor(configuration.isPressed ? .statePressed : .clear)
            )
    }
}

但这将删除在辅助功能模式下显示按钮形状的默认行为:

Settings > Accessibility > Display & Text Size -> Button Shapes -> true

如何获取DefaultButtonStyle的代码来复制此相关人员,或者如何不创建新的ButtonStyle,而是修改DefaultButtonStyle?

4dc9hkyq

4dc9hkyq1#

当您创建自己的按钮样式时,您可以使用可访问性环境变量来使样式响应用户更改。
对于按钮形状设置,环境属性是\.accessibilityShowButtonShapes,因此您可以监视该值并相应地调整样式。例如,如果您希望某个形状的背景在需要显示按钮形状时可见,则可以使用变量来调整其不透明度:

private struct ListCellButtonStyle: ButtonStyle {
    @Environment(\.accessibilityShowButtonShapes) private var accessibilityShowButtonShapes

    func makeBody(configuration: Configuration) -> some View {
       // some view
       .background {
         Color.gray.opacity(accessibilityShowButtonShapes ? 0.2 : 0.0)
       }
    }
}
ojsjcaue

ojsjcaue2#

你可以使用一个默认样式的虚拟按钮作为基础视图,并将你的自定义按钮应用为覆盖。当按钮形状打开时,按钮形状将显示在前景中的样式后面。
通过使虚拟按钮成为基础视图,而不是将其显示为背景层,当按钮形状打开时添加的额外填充将对整个形状生效。因此,没有必要自己添加任何填充物。

func makeBody(configuration: Configuration) -> some View {
    Button {} label: { configuration.label.hidden() }
        .disabled(true)
        .overlay {
            configuration.label
        }
        .overlay {
            if configuration.isPressed {
                Color.statePressed
            }
        }
}

您会注意到虚拟按钮的标签是隐藏的。这可以防止它被看到,但它仍然在布局中占据相同的空间。因此,当按钮形状打开时,形状在前景中具有适合标签的大小。此外,按下按钮时的覆盖应用于基础视图,因此它也采用基础视图的大小。

相关问题