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

SwiftUI中菜单项删除线样式无法生效的问题求助

SwiftUI Menu菜单项删除线不生效的问题解决

问题原因

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:54:09