这是我的看法。我实际上是为 MacOS 做的,但过程应该是一样的。
首先,我必须通过创建两个 png 图像来伪造复选框: 和 ,分别称它们为 checkbox-on.png 和 checkbox-off.png。这些我放入Assets.xcassets。
我相信对于 iOS,图像已经可用。
二、视图包含一个状态变量:
@State var checked = false
剩下的就是实现一个带有动作、图像、一些文本和一些修饰符的按钮:
Button(action: {
checked.toggle()
}) {
Image(checked ? "checkbox-on" : "checkbox-off")
.renderingMode(.original)
.resizable()
.padding(0)
.frame(width: 14.0, height: 14.0)
.background(Color(NSColor.controlBackgroundColor))
Text("Choose me … !").padding(0)
}
.buttonStyle(PlainButtonStyle())
.background(Color(red: 0, green: 0, blue: 0, opacity: 0.02))
.cornerRadius(0)
-
checked 是您要切换的布尔变量
- 图像取决于布尔值,使用条件运算符在两者之间进行选择
-
renderingMode() 确保图像正确显示,resizable() 用于启用frame()。
- 其余的修饰符用于调整外观。
显然,如果你要养成这样的习惯,你可以创建一个结构体:
struct Checkbox: View {
@Binding var toggle: Bool
var text: String
var body: some View {
Button(action: {
self.toggle.toggle()
}) {
Image(self.toggle ? "checkbox-on" : "checkbox-off")
.renderingMode(.original)
.resizable()
.padding(0)
.frame(width: 14.0, height: 14.0)
.background(Color(NSColor.controlBackgroundColor))
Text(text).padding(0)
}
.buttonStyle(PlainButtonStyle())
.background(Color(red: 0, green: 0, blue: 0, opacity: 0.02))
.cornerRadius(0)
}
}
然后使用:
Checkbox(toggle: self.$checked, text: "Choose me … !")
(注意这个需要使用self.$checked)。
最后,如果您更喜欢使用常见的替代外观,即复选框的填充方块,您可以将Image 替换为:
Rectangle()
.fill(self.autoSave ? Color(NSColor.controlAccentColor) : Color(NSColor.controlColor))
.padding(4)
.border(Color(NSColor.controlAccentColor), width: 2)
.frame(width: 14, height: 14)
我在这方面学到了很多东西,希望这会有所帮助。