【问题标题】:Highlight SwiftUI Button programmatically以编程方式突出显示 SwiftUI 按钮
【发布时间】: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,例如stackoverflow.com/questions/62678306/…,解决方法是相同的。
  • 感谢@Asperi,我仍然无法相信即使在 iOS 14 中也无法访问配置的 isPressed 属性。这是我期望从任何 UI 框架中获得的基本行为!

标签: swiftui


【解决方案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 提供的默认行为。我会尝试进一步研究。
猜你喜欢
  • 2020-11-18
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多