以编程方式突出显示 SwiftUI 按钮

Posted

技术标签:

【中文标题】以编程方式突出显示 SwiftUI 按钮【英文标题】:Highlight SwiftUI Button programmatically 【发布时间】:2020-08-13 10:40:03 【问题描述】:

我一直在尝试以编程方式突出显示 SwiftUI Button,但到目前为止没有成功……

当然我可以再次实现整个事情,但我真的很想利用 SwiftUI 已经提供的功能。我想有一个我们可以改变的环境或状态变量,但我找不到这些。

这是我想要实现的一个小例子:

struct ContentView: View 
    @State private var highlighted = false

    var body: some View 
        Button("My Button", action: doSomething())
            .highlighted($highlighted) // <-- ??

        Button("Toggle highlight") 
            highlighted.toggle()
        
    

   func doSomething()  ... 

在 SwiftUI 中实现如此简单的事情似乎很奇怪。有人找到解决方案了吗?

【问题讨论】:

您能否为您的代码提供您希望在何处/如何(在何种条件下)突出显示 按钮? highlight 是什么意思 - 颜色、边框、文本......以及何时/如何取消突出显示?因为目标有点模糊。 当然,让我编辑问题。关于我所说的 highlight 的意思,它实际上是 SwiftUI 所做的一切:背景颜色、颜色……取决于上下文。 如果你的意思是让按钮执行默认高亮,那么现在在 SwiftUI 中是不可能的。如果您的意思是自定义突出显示,那么您需要ButtonStyle,例如***.com/questions/62678306/…,解决方法是相同的。 感谢@Asperi,我仍然无法相信即使在 ios 14 中也无法访问配置的 isPressed 属性。这是我期望从任何 UI 框架中获得的基本行为! 【参考方案1】:

这是基于自定义ButtonStyle 的可能方法的演示。使用 Xcode 11.4 / iOS 13.4 测试

struct HighlightButtonStyle: ButtonStyle 
    let highlighted: Bool

    func makeBody(configuration: Configuration) -> some View 
        configuration.label
            .background(highlighted || configuration.isPressed ? Color.yellow : Color.clear)
    


extension Button 
    func highlighted(_ flag: Bool) -> some View 
        self.buttonStyle(HighlightButtonStyle(highlighted: flag))
    


struct ContentView: View 
    @State private var highlighted = false

    var body: some View 
        VStack 
            Button("My Button", action: doSomething)
                .highlighted(highlighted)
            Divider()
            Button("Toggle highlight") 
                self.highlighted.toggle()
            
        
    

   func doSomething()  

【讨论】:

谢谢!这更像是一种解决方法,因为我们覆盖了 SwiftUI 提供的默认行为。我会尝试进一步研究。

以上是关于以编程方式突出显示 SwiftUI 按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式突出显示 UIButton?

以编程方式单击时突出显示 TextView

Android:以编程方式突出显示listview中的当前选定选项

在 SwiftUI 中关闭按钮突出显示

在鼠标悬停时突出显示L.divIcon或在Leaflet地图中以编程方式突出显示

UIButton 以编程方式获取默认突出显示样式