如何找出SwiftUI中当前是否选择了视图

时间:2019-10-16 21:30:50

标签: ios swift swiftui

我想确定当前是否选择了我的视图。 我有一个代表卡片的矩形。点击卡片后,卡片应进入选定状态并更改颜色等属性。

但是一旦我在其他地方点击,该卡就不再应该处于该状态。

到目前为止,我在尝试使用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的顶视图中,则行为应相同。

1 个答案:

答案 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
                }
        }
    }
}