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
相关产品推荐
相关产品推荐

