如何在 SwiftUI 中获取分段样式按钮
How do I get segment style button in SwiftUI
所以在 SwiftUI、macOS 中,我想要单独的按钮,它们可以像复选框一样打开和关闭,但看起来像按钮,它们相互关联,像位标志一样思考,所以我希望它们像你一样触摸使用 NSSegmentedControl
,在我看来你想使用 Button
或 Toggle
和一些修饰符来对它们进行分组,但我找不到它,PickerStyle
似乎是唯一的单选选项,这很有意义,因为 SwiftUI 似乎更多地是关于描述功能,然后控制它的呈现方式。
更新更清楚
对于正则表达式选项,我可以用checkbox来做,但是看起来不太好,感觉应该有一个方法来改变checkbox的显示方式,在这个例子中我有第一个启用三个按钮。
这是一个简单的自定义解决方案:
struct Option: Hashable {
let label: String
var selected: Bool
}
struct ContentView: View {
@State var options: [Option] = [
Option(label: "Dot All", selected: false),
Option(label: "Extended", selected: false),
Option(label: "Ignore Case", selected: false),
Option(label: "Multi-line", selected: false),
]
var body: some View {
OptionPicker(options: $options)
}
}
struct OptionPicker: View {
@Binding var options: [Option]
var body: some View {
HStack(spacing: 0) {
ForEach(options.indices, id: \.self) { i in
Text(options[i].label)
.padding(.horizontal, 4)
.padding(5)
.background(options[i].selected ? .blue : .gray)
.onTapGesture {
options[i].selected.toggle()
}
if i < options.count-1 {
Divider()
}
}
}
.foregroundColor(.white)
.cornerRadius(10)
.frame(height: 32)
}
}
所以在 SwiftUI、macOS 中,我想要单独的按钮,它们可以像复选框一样打开和关闭,但看起来像按钮,它们相互关联,像位标志一样思考,所以我希望它们像你一样触摸使用 NSSegmentedControl
,在我看来你想使用 Button
或 Toggle
和一些修饰符来对它们进行分组,但我找不到它,PickerStyle
似乎是唯一的单选选项,这很有意义,因为 SwiftUI 似乎更多地是关于描述功能,然后控制它的呈现方式。
更新更清楚
对于正则表达式选项,我可以用checkbox来做,但是看起来不太好,感觉应该有一个方法来改变checkbox的显示方式,在这个例子中我有第一个启用三个按钮。
这是一个简单的自定义解决方案:
struct Option: Hashable {
let label: String
var selected: Bool
}
struct ContentView: View {
@State var options: [Option] = [
Option(label: "Dot All", selected: false),
Option(label: "Extended", selected: false),
Option(label: "Ignore Case", selected: false),
Option(label: "Multi-line", selected: false),
]
var body: some View {
OptionPicker(options: $options)
}
}
struct OptionPicker: View {
@Binding var options: [Option]
var body: some View {
HStack(spacing: 0) {
ForEach(options.indices, id: \.self) { i in
Text(options[i].label)
.padding(.horizontal, 4)
.padding(5)
.background(options[i].selected ? .blue : .gray)
.onTapGesture {
options[i].selected.toggle()
}
if i < options.count-1 {
Divider()
}
}
}
.foregroundColor(.white)
.cornerRadius(10)
.frame(height: 32)
}
}