您可以使用FocusState
跟踪键盘导航当前 Select 的按钮.使用此功能,您可以编写一个自定义ButtonStyle
,该ButtonStyle
在按钮聚焦时创建自定义聚焦效果.您可以使用.focusEffectDisabled()
关闭默认聚焦效果(蓝色轮廓).
把焦点状态传递到ButtonStyle
有点困难.isFocused
环境价值观在这里不起作用.您可以使用.buttonStyle
修改器单独修改每个按钮,这些修改器具有不同的参数,就像Benzy Neez的回答,但我更喜欢使用自定义的环境值.
例如,这里有一个按钮样式,当按钮被聚焦时,它会放大.
struct MyButtonStyle: ButtonStyle {
@Environment(\.customFocus) var focus
func makeBody(configuration: Configuration) -> some View {
configuration.label
.scaleEffect(focus ? 1.5 : 1)
}
}
struct CustomFocusKey: EnvironmentKey {
static let defaultValue = false
}
extension EnvironmentValues {
var customFocus: Bool {
get { self[CustomFocusKey.self] }
set { self[CustomFocusKey.self] = newValue }
}
}
您可以使用ViewModifier
来传递焦点状态:
struct CustomFocusModifier: ViewModifier {
@FocusState var focus: Bool
func body(content: Content) -> some View {
content
.focused($focus)
.environment(\.customFocus, focus)
}
}
extension View {
func customFocus() -> some View {
modifier(CustomFocusModifier())
}
}
示例用法:
HStack {
Button("Foo") { ... }
.customFocus()
Button("Bar") { ... }
.customFocus()
}
.buttonStyle(MyButtonStyle())
.focusEffectDisabled()