You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止SwiftUI按钮长按过程中出现置灰效果

解决SwiftUI长按Button时默认变灰的问题

要消除Button长按过程中的默认灰色高亮效果,只需修改按钮样式,禁用系统自带的交互反馈,以下是两种实用方案:

方案一:使用Plain按钮样式

给Button添加.buttonStyle(.plain)修饰符,直接移除系统默认的高亮效果,同时保留按钮的可点击特性:

@State private var pressed = false

Button(
    action: {

    }, label: {
        Image("book_Fotor")
            .resizable()
            .scaledToFit()
            .frame(width: 70, height: 85)
    }
)
.buttonStyle(.plain) // 关键:移除默认高亮样式
.scaleEffect(pressed ? 1.25 : 1.0)
.onLongPressGesture(
    minimumDuration: 2.5,
    maximumDistance: .infinity,
    pressing: { pressing in
        withAnimation(.easeIn(duration: 0.75)) {
            self.pressed = pressing
        }
    }, perform: {

    }
)

方案二:自定义ButtonStyle(灵活定制)

如果需要更精细的控制(比如仅禁用长按状态的高亮,保留其他状态逻辑),可以自定义ButtonStyle,完全掌控按钮在不同状态下的外观:

struct NoHighlightButtonStyle: ButtonStyle {
    func makeBody(configuration: Configuration) -> some View {
        configuration.label
            .opacity(1) // 强制保持原透明度
            .foregroundColor(.primary) // 强制保持原颜色
            // 若需要其他自定义样式,可在此添加
    }
}

// 使用自定义样式
Button(...)
.buttonStyle(NoHighlightButtonStyle())
.scaleEffect(pressed ? 1.25 : 1.0)
// 其他修饰符...

说明

  • 方案一的.plain样式是最简便的选择,适合大多数场景,它会移除按钮的所有默认背景和高亮效果,只保留点击交互能力。
  • 方案二的自定义样式适合需要定制化按钮外观的场景,你可以根据configuration.isPressed自由调整状态表现,这里我们直接忽略该状态,确保颜色和透明度全程不变。

内容的提问来源于stack exchange,提问作者mzm0227

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:47:20