我的应用程序包括两个按钮,而且,为了成为一个好的平台公民,我希望用户在打开System Settings > Keyboard > Keyboard navigation时能够使用键盘导航它们.

然而,这在我的按钮周围创造了一个非常可怕的亮点,我似乎无法摆脱.

理想情况下,我希望在按钮有焦点时定制按钮样式(例如,改变背景,或使文本粗体).

请看下面的图片,左边的按钮有焦点,周围有一个丑陋的橙色环,部分模糊了投影:

App screenshot, showing the highlight around the left button

推荐答案

您可以使用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()

Swift相关问答推荐

计算Vision OS相机与Vision OS中3D模型之间的距离

如何禁用MacOS上SwiftUI中按钮周围的聚焦环(或高亮显示)?

如何在HStack中均匀分布视图?

如何将EnvironmentObject从UIKit视图控制器传递到SwiftUI视图

如何在每天午夜重置布尔值

当计数大于索引时,索引超出范围崩溃

如何将函数参数(字符串文字)标记为可本地化?

如何在SwiftUI 4+(iOS 16+)中使用新的NavigationStack进行导航

将变量设置为 @Published 会 destruct 代码而不会出现任何错误

TimeZone 背后的目的

为什么无法在 Swift 中使用AVFoundation扫描 QRCode

Swift Combine:如何在保留发布者结果顺序的同时进行收集?

如果 Swift 无法分配内存会怎样?

在 Vapor 4 中使用协议的通用流利查询

自定义选取器的出现导致其他视图重新排列

iOS Swift - 如何更改表格视图的背景 colored颜色 ?

FirebaseStorage:如何删除目录

swift中静态函数和单例类的区别

在 Swift 中从服务器播放视频文件

如何在 SwiftUI 中的一个视图上显示两个alert ?