PAYATHON 2026

SwiftUI 中如何让按钮底部边框显示在 GlassEffect 上?

数据小陈

结论

在每个按钮的标签视图上应用 .glassEffect(),再用 .overlay(alignment: .bottom) 绘制选中状态的底边。GlassEffectContainer 用来容纳并协调其中的玻璃效果视图。若把 .glassEffect() 应用在容器外层,效果会作用于组合后的整体,而不是各个按钮。

原代码用 .background 在标签后方绘制底边。玻璃效果可能会遮住这层背景,因此可以改用玻璃效果视图的 overlay,让底边显示在效果上方。

修改示例

struct GroupedGlassBorder: View {
    @State private var selected = 1

    var body: some View {
        GlassEffectContainer {
            HStack {
                BorderButton(title: "One", num: 1, selected: $selected)
                BorderButton(title: "Two", num: 2, selected: $selected)
                BorderButton(title: "Three", num: 3, selected: $selected)
            }
        }
    }
}

struct BorderButton: View {
    var title: String
    var num: Int
    @Binding var selected: Int

    var body: some View {
        Button {
            selected = num
        } label: {
            Text(title)
                .padding(12)
                .glassEffect()
                .overlay(alignment: .bottom) {
                    Capsule()
                        .fill(selected == num ? .red : .clear)
                        .frame(height: 2)
                }
        }
    }
}

.glassEffect() 为按钮标签添加玻璃外观,后续的 overlay 在底部绘制 Capsule。当 selected == num 时,底边为红色;否则使用透明色隐藏。

注意事项

这项调整改变的是按钮玻璃效果与底边的绘制顺序。如果项目的目标系统或 SDK 不支持所用的 SwiftUI 玻璃效果 API,需要先确认该 API 的适用条件。仅凭题目中的代码,无法判断项目的具体配置。

备注:内容仅供参考。