无法在 SwiftUI 中的菜单内设置按钮标签的颜色

Posted

技术标签:

【中文标题】无法在 SwiftUI 中的菜单内设置按钮标签的颜色【英文标题】:Cannot set color of Button's Label inside Menu in SwiftUI 【发布时间】:2021-02-18 11:56:09 【问题描述】:

如果我在 SwiftUI (ios) 中创建 Menu,我无法设置内部按钮的颜色,例如:

Menu("Actions") 
    Button(action:  ) 
        Label("Whatever", systemImage: "pencil")
             .background(Color.red)  // does not work
    
    .background(Color.red)           // does not work either
    .buttonStyle(RedButtonStyle())   // does not work either


struct RedButtonStyle: ButtonStyle 
    func makeBody(configuration: Configuration) -> some View 
        configuration.label.foregroundColor(Color.red)
    

如果我使用TextImage(我知道this)代替Label,它也不起作用。

有什么办法吗?

P.S.:还有一个related SO question,但它非常通用,范围更广。

【问题讨论】:

您无法在 SwiftUI 2.0 中更改默认的 Menu 按钮样式、颜色等。您可以尝试构建自己的自定义Menu 您发布的链接指向 Apple 的示例代码,了解如何使用 UIKit 创建您自己的。遵循这一点,然后将其包装成 UIViewControllerRepresentableUiViewRepresentable 以使其在 SwiftUI 中工作。 【参考方案1】:

现在可以在 iOS 15 中通过设置 Button 的角色来实现。 Documentation

例子:

Menu("Actions") 
    Button(role: .destructive, action:  ) 
        Label("Whatever", systemImage: "pencil")
    

结果:

【讨论】:

我希望 iOS 14 有一个解决方法,而无需求助于 UIKit。不管怎么说,还是要谢谢你。我真的很讨厌为了克服 SwiftUI 的缺陷,我必须使用更高版本的操作系统本身...... @noe 是的,有时您只需要在某些部分使用 UIKit。我最近有一个问答here,实际上是为了创建一个自定义上下文菜单。我用ScrollView 做内省,然后用scrollView.subviews.first!.addInteraction(/* interaction delegate instance */) 添加UIContextMenuInteraction。您可能会发现实现 iOS 14 版本的上下文菜单很有用。 谢谢!我去看看。

以上是关于无法在 SwiftUI 中的菜单内设置按钮标签的颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NSMenuItem 内绘制内联样式标签(或按钮)

swiftui 文本字段和按钮内的按钮

编译器无法在 SwiftUI 中的合理时间内对该表达式进行类型检查?

SwiftUI:更改 ZStack .zIndex 顺序

使用本地 JSON 中的键:值更改按钮/标签文本 - SwiftUI

SwiftUI-自定义容器