SwiftUI: как справиться с обоими касаниями и длительным нажатием кнопки?

11

У меня есть кнопка в SwiftUI, и я хотел бы иметь возможность выполнять различные действия для «нажатия кнопки» (обычное нажатие / нажатие) и «долгое нажатие».

Это возможно в SwiftUI?

Вот простой код для кнопки, которую я имею сейчас (обрабатывает только «нормальный» случай касания / касания).

Button(action: {self.BLEinfo.startScan() }) {
                        Text("Scan")
                    } .disabled(self.BLEinfo.isScanning)

Я уже пытался добавить «жест longPress», но он все еще только «выполняет» обычный / короткий щелчок. Это был код, который я попробовал:

Button(action: {self.BLEinfo.startScan() }) {
                        Text("Scan")
                            .fontWeight(.regular)
                            .font(.body)
                        .gesture(
                            LongPressGesture(minimumDuration: 2)
                                .onEnded { _ in
                                    print("Pressed!")
                            }
                        )
                    }

Спасибо!

Gerard

Gerard
источник

Ответы:

15

Я перепробовал много вещей, но в конце концов я сделал что-то вроде этого:

    Button(action: {
    }) {
        VStack {
            Image(self.imageName)
                .resizable()
                .onTapGesture {
                    self.action(false)
                }
                .onLongPressGesture(minimumDuration: 0.1) {
                    self.action(true)
                }
        }
    }

Это все еще кнопка с эффектами, но короткие и длинные нажатия отличаются.

norekhov
источник
3
Обратите внимание, что начиная с Xcode 11.2.1 / iOS 13.2 порядок здесь важен. Использование onLongPressGesture()before onTapGesture()проигнорирует последнее.
Корактор
здесь нет анимации касания или нажатия и блокировки кодаaction
Фарук
3

Я только что обнаружил, что эффект зависит от порядка реализации. Реализуя обнаружение жестов в следующем порядке, представляется возможным обнаружить и идентифицировать все три жеста:

  1. справиться с жестом двойного касания
  2. обрабатывать longPressGesture
  3. обрабатывать одним касанием жест

Протестировано на Xcode версии 11.3.1 (11C504)

    fileprivate func myView(_ height: CGFloat, _ width: CGFloat) -> some View {
    return self.textLabel(height: height, width: width)
        .frame(width: width, height: height)
        .onTapGesture(count: 2) {
            self.action(2)
        }
        .onLongPressGesture {
            self.action(3)
        }
        .onTapGesture(count: 1) {
            self.action(1)
        }
}
Андреас Фогель
источник
1

Это не проверено, но вы можете попробовать добавить LongPressGestureк своей кнопке.

Предположительно это будет выглядеть примерно так.

struct ContentView: View {
    @GestureState var isLongPressed = false

    var body: some View {
        let longPress = LongPressGesture()
            .updating($isLongPressed) { value, state, transaction in
                state = value
            }

        return Button(/*...*/)
            .gesture(longPress)
    }
}
Kilian
источник
Привет, Килиан. На самом деле я должен был упомянуть, что уже пытался добавить жест longPress, но он все равно будет «выполнять» действие «обычного щелчка», а не долгое нажатие. Отредактирую мой пост, добавив это (поскольку вы - второй человек, предложивший это - первый удалил свой ответ).
Джерард