SwuftUI Gesture location обнаруживает щелчки за пределами границы просмотра - PullRequest
0 голосов
/ 20 января 2020

Если я поставлю несколько видов подряд без пробелов (или очень мало пробелов между ними) и добавлю какое-либо действие Gesture, я не смогу правильно определить, какой из них был нажат. Похоже, что есть некоторый отступ внутри жеста, который я не могу удалить.

вот пример кода:

struct ContentView: View {
    @State var tap = 0
    @State var lastClick = CGPoint.zero
    var body: some View {
        VStack{
            Text("last tap: \(tap)")
            Text("coordinates: (x: \(Int(lastClick.x)), y: \(Int(lastClick.y)))")
            HStack(spacing: 0){
                ForEach(0...4, id: \.self){ind in
                    RoundedRectangle(cornerRadius: 10)
                        .foregroundColor(Color.gray)
                        .overlay(Text("\(ind)"))
                        .overlay(Circle()
                            .frame(width: 4, height: 4)
                            .foregroundColor(self.tap == ind ? Color.red : Color.clear)
                            .position(self.lastClick)

                        )
                        .frame(width: 40, height: 50)
                        //.border(Color.black, width: 0.5)
                    .gesture(DragGesture(minimumDistance: 0)
                        .onEnded(){value in
                            self.tap = ind
                            self.lastClick = value.startLocation
                        }
                    )
                }
            }
        }
    }
}

и поведение:

enter image description here

Я хочу, чтобы Gesture обнаружил нажатие кнопки 0, когда местоположение щелчка становится отрицательным. Есть ли способ сделать это?

1 Ответ

1 голос
/ 20 января 2020

Я провел несколько часов с этой проблемой, и сразу после публикации этого вопроса я нашел решение. это было так просто - просто добавить contentShape модификатор

  ...
                       .frame(width: 40, height: 50)
                       .contentShape(Rectangle())
                    .gesture(DragGesture(minimumDistance: 0)
    ...
...