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!")
                            }
                        )
                    }

Дякую!

Джерард

Відповіді:


15

Я спробував багато речей, але нарешті зробив щось подібне:

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

Це все ще кнопка з ефектами, але коротке та тривале натискання відрізняються.


3
Зверніть увагу, що, як і для Xcode 11.2.1 / iOS 13.2, порядок тут здається важливим. Використання onLongPressGesture()раніше onTapGesture()ігнорує останнє.
Корактор

це не має анімації натискання або натискання та блокування коду вaction
Фарук

3

Я щойно виявив, що ефект залежить від порядку виконання. Здійснюючи виявлення жестів у такому порядку, схоже, можливо виявити та ідентифікувати всі три жести:

  1. обробити подвійним жестом натискання
  2. обробляти довгийПрес-жест
  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)
    }
}

Привіт Кіліан Насправді я мав би зазначити, що я вже намагався додати жест longPress, але він все ще лише "виконає" дію "звичайного клацання", а не довге натискання. Відредагуйте мою публікацію, щоб додати це (оскільки ви є другою людиною, яка запропонувала це - перша видалила свою відповідь).
Джерард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.