SwiftUI中菜单项删除线样式无法生效的问题求助
问题原因
SwiftUI的Menu组件底层依赖UIKit的UIMenu实现,系统会为菜单项应用统一的默认文本样式,直接给Text或Button添加strikethrough()修饰符会被系统样式覆盖,因此无法生效。而普通视图不受这个限制,所以删除线能正常显示。
解决方案
方法1:使用AttributedString定义带删除线的文本
通过AttributedString直接设置文本的删除线属性,这种方式能被系统菜单的样式系统识别,不会被覆盖:
Menu("Actions") { // 带点击事件的菜单项 Button(action: { // 执行你的操作 }) { Text(AttributedString("Banana 🍌🍌") .applyingAttributes([ .strikethroughStyle: NSUnderlineStyle.single.rawValue, .strikethroughColor: Color.gray // 可选:自定义删除线颜色 ])) } // 带图标的菜单项(使用Label) Label( title: { Text(AttributedString("Banana 🍌🍌") .applyingAttributes([.strikethroughStyle: NSUnderlineStyle.single.rawValue])) }, icon: { Image(systemName: "applelogo") } ) .onTapGesture { // 执行你的操作 } }
方法2:自定义容器视图包裹文本
如果不想用AttributedString,可以将文本放在容器视图中,确保删除线样式被保留,同时手动处理点击事件:
Menu("Actions") { HStack { Text("Banana 🍌🍌") .strikethrough() .foregroundColor(.primary) // 匹配系统文本颜色 Spacer() } .contentShape(Rectangle()) // 确保整个区域可点击 .onTapGesture { // 执行你的操作 } }
注意:这种方法的菜单项样式可能和系统默认样式略有差异,需要手动调整颜色、间距等属性来匹配。
内容的提问来源于stack exchange,提问作者Mackan
相关产品推荐
相关产品推荐

