Определите, касался ли пользователь экрана, включая кнопки, в SwiftUI

#swiftui

Вопрос:

Я пытался использовать .onTapGesture, чтобы определить, нажимает ли пользователь на экран. Однако я заметил, что он не срабатывает, если пользователь нажимает на доступные элементы, такие как кнопки и средства выбора. Есть ли способ определить, нажимает ли пользователь на экран, включая эти доступные для действий элементы, без необходимости вручную вызывать мою viewTapped функцию для каждой кнопки, средства выбора и т.д. Отдельно?

Вот код, который я использовал для проверки этого.

 struct ContentView: View {
    @State var mode = 0
        
    var body: some View {
        ZStack {
            VStack {
                Text("Hello, world!")
                    .padding()
                
                Picker(
                    selection: $mode,
                    label: Text("Picker")) {
                    Text("Option 1").tag(0)
                    Text("Option 2").tag(1)
                }
                .pickerStyle(SegmentedPickerStyle())
                .frame(width: 200)
                .foregroundColor(.white)
                .padding()
                
                Button {
                    print("button clicked")
                } label: {
                    Text("Click me")
                }
                .padding()
            }
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .background(Color.green)
        .onTapGesture {
            viewTapped()
        }
    }
    
    public func viewTapped() {
        print("view tapped")
    }
}
 

Комментарии:

1. Значит, вы хотите и button clicked то и другое и view tapped напечатать?

Ответ №1:

Если вам нужно определить одновременность прикосновений, вместо этого вам понадобится simultaneousGesture модификатор. Нравится:

 
.simultaneousGesture(
    TapGesture()
        .onEnded {
            viewTapped()
        }
)