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

SwiftUI中自定义上下文菜单项高亮颜色问题

解决方案

要解决长按上下文菜单时的高亮问题,同时保留按钮动画和可见性,可以尝试以下两种方法:

方法一:iOS 16+ 原生高亮自定义

如果项目支持 iOS 16 及以上版本,直接通过 .highlightStyle 修改上下文菜单预览的高亮背景色为透明即可,这是最简洁的方案:

Button {
    // 按钮点击逻辑
} label: {
    Image("your-image-name") // 带透明空白区域的图片
}
.contextMenu {
    Button("菜单选项1") { /* 对应动作 */ }
    Button("菜单选项2") { /* 对应动作 */ }
}
.highlightStyle(.init(backgroundColor: .clear))

该设置仅移除上下文菜单唤起时的浅灰色高亮,不会影响按钮常规点击的高亮效果,同时完整保留按钮的尺寸调整动画和可见性。

方法二:适配 iOS 15 及以下版本(自定义按钮样式)

如果需要兼容 iOS 15,可通过自定义 ButtonStyle 控制长按状态的高亮表现:

struct TransparentContextMenuButtonStyle: ButtonStyle {
    func makeBody(configuration: Configuration) -> some View {
        configuration.label
            .opacity(configuration.isPressed ? 0.9 : 1) // 保留常规点击的轻微透明度反馈
            .overlay(
                // 上下文菜单唤起时强制高亮层为透明
                configuration.isPressed && UIMenuController.shared.isMenuVisible ? Color.clear : Color.clear
            )
    }
}

// 使用方式
Button {
    // 按钮点击逻辑
} label: {
    Image("your-image-name")
}
.contextMenu {
    Button("菜单选项1") { /* 对应动作 */ }
}
.buttonStyle(TransparentContextMenuButtonStyle())

这种方式通过自定义按钮样式,在长按唤起上下文菜单时屏蔽高亮显示,同时保留常规点击的动画反馈。

注意:避免使用 .contentShape(.contextMenuPreview, Circle().size(width: 0, height: 0)) 这类将点击区域缩小至消失的设置,它会破坏视图的正常布局和动画逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:50:21