Кнопки блокировки жестов в ZStack - PullRequest
0 голосов
/ 21 октября 2019

У меня есть жест, добавленный к прямоугольнику внутри ZStack. У меня есть VStack, который представляет собой вид или меню кнопок. Когда я добавляю жест в прямоугольник (поскольку мне нужно обнаружить касание в этом представлении за кнопками меню), кнопки не могут получать взаимодействие с пользователем на устройстве. У меня есть прямоугольник за кнопками, и они отображаются над прямоугольником. На симуляторе все работало нормально, а на устройстве - нет. Любая помощь будет принята с благодарностью от сообщества. Спасибо!

var body: some View {
        ZStack {
            Rectangle()
                .foregroundColor(Color.black.opacity(0.01))
                .gesture(DragGesture(minimumDistance: 0)
                    .onChanged({ (value) in
                    self.store.tapped = true
                }))
            VStack(alignment: .leading, spacing: 0) {
                //menu buttons
                HStack(alignment: .center, spacing: 18.5) {
                    someView()
                        .environmentObject(self.anotherStore)
                        .frame(width: 145, height: 22)
                    self.otherSubviews()
                }
                .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 37, alignment: .leading)
                .padding(EdgeInsets(top: 0, leading: 6, bottom: 0, trailing: 6))
                //menu detail view
                self.detailView()
                }
            .padding(EdgeInsets(top: 6, leading: 6, bottom: 6, trailing: 12))
        }
    }

Я попытался изменить .zIndex для обоих на -1 для прямоугольника на что-то более высокое для представления меню. Это ничего не меняет

Я бы хотел, чтобы Rectangle получал взаимодействие (нажатия) от пользователя, а также чтобы VStack кнопок также получал взаимодействие от пользователя.

1 Ответ

0 голосов
/ 22 октября 2019

Выяснили, что с представлением на заднем плане, которое имеет жест, вам нужно убедиться, что ваши другие представления имеют .contentShape(Specify A Shape).

В документации Apple говорится:

    /// Returns a new view that defines the content shape for
    /// hit-testing `self` as `shape`.

Я добавил .contentShape(Rectangle()) к VStack, и это разрешало касания для вида меню кнопок, а также разрешает касания в виде прямоугольника. на заднем фоне.

Обновлен код с ответом

var body: some View {
        ZStack {
            Rectangle()
                .foregroundColor(Color.black.opacity(0.01))
                .gesture(DragGesture(minimumDistance: 0)
                    .onChanged({ (value) in
                    self.store.tapped = true
                }))
            VStack(alignment: .leading, spacing: 0) {
                //menu buttons
                HStack(alignment: .center, spacing: 18.5) {
                    someView()
                        .environmentObject(self.anotherStore)
                        .frame(width: 145, height: 22)
                    self.otherSubviews()
                }
                .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 37, alignment: .leading)
                .padding(EdgeInsets(top: 0, leading: 6, bottom: 0, trailing: 6))
                //menu detail view
                self.detailView()
                }.contentShape(Rectangle()) //Define a tappable area
            .padding(EdgeInsets(top: 6, leading: 6, bottom: 6, trailing: 12))
        }
    }
...