Как узнать, выбран ли вид в данный момент в SwiftUI - PullRequest
2 голосов
/ 17 октября 2019

Я хотел бы узнать, выбран ли мой вид в настоящее время или нет. У меня есть прямоугольник, который представляет карту. После того, как я коснусь карты, карта должна перейти в выбранное состояние и изменить свойства, например цвет.

Но как только я коснусь другого места, карта больше не будет в этом состоянии.

До сих пор мне не удалось выяснить это, когда я пытался со свойством onTapGesture, но с этим я столкнулся с проблемой, что, когда я касаюсь за пределами этой карты, карта не меняет состояние на ложное, если я не касаюсь картыопять же, что имеет смысл, но в данном случае это неправильный выбор.

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 Ответ

1 голос
/ 19 октября 2019

Способ добиться этого - заставить родительский вид управлять как выделением, так и жестами.

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
                }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...