我想确定当前是否选择了我的视图。 我有一个代表卡片的矩形。点击卡片后,卡片应进入选定状态并更改颜色等属性。
但是一旦我在其他地方点击,该卡就不再应该处于该状态。
到目前为止,我在尝试使用onTapGesture
属性时并没有弄清楚这个问题,但是遇到了一个问题,当我在该卡的外部点击时,该卡不会将状态更改为false除非我再次点击卡,否则这是有道理的,但在这种情况下,这似乎是错误的选择。
import SwiftUI
struct CardView: View {
@State var selected = false
let rectangle = Rectangle()
@State var rectangleColor: Color = .purple
var body: some View {
GeometryReader { g in
self.rectangle
.foregroundColor(self.rectangleColor)
.frame(width: g.size.width / 2, height: g.size.width / 2)
.onTapGesture {
self.selected.toggle()
self.modifyColors()
}
}
}
func modifyColors() {
if selected {
rectangleColor = .red
} else {
rectangleColor = .purple
}
}
}
选定状态为红色,未选定状态为紫色。 因此,我希望在点击矩形时颜色变为红色,但在矩形外部点击时颜色不变为红色。 仅当我在矩形外部点击而不在矩形内部点击时,它才应该再次变为紫色。 示例:卡为紫色。我选择它,它变成红色。当我再次点击它时,它应该保持红色。当我在卡外的某个地方而不是卡内的某个地方,它应该只会变成紫色(未选中)。
包含此矩形的视图:
import SwiftUI
struct ContentView: View {
var body: some View {
CardView()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
该视图实际位于什么位置都没关系-我想知道天气如何利用该视图周围的空间。因此,如果它位于模式堆栈或ZStack的顶视图中,则行为应相同。
答案 0 :(得分:1)
实现此目的的方法是让父视图同时管理选择和手势。
CardView只需将@Binding绑定到isSelected并相应地更改颜色:
struct CardView: View {
@Binding var isSelected: Bool
var body: some View {
Rectangle()
.fill(self.isSelected ? Color.red : Color.purple)
.aspectRatio(1.0, contentMode: .fit)
}
}
当父级管理@State并使用手势对其进行更新时。
struct ContentView: View {
@State var isCardSelected = false
var body: some View {
ZStack {
Color.white
.onTapGesture {
self.isCardSelected = false
}
CardView(isSelected: $isCardSelected)
.onTapGesture {
self.isCardSelected = true
}
}
}
}