Действие триггера при отпускании LongPressGesture SwiftUI

Я пытаюсь вызвать нажатое сообщение, когда я отпускаю LongPressGesture внутри минимального расстояния, но этот код вместо этого распечатывает сообщение, как только я долго нажимаю на изображение. Как я могу это решить?

struct ContentView: View {
    @GestureState private var isDetectingPress = false
    
    var body: some View {
        Image(systemName: "trash")
            .resizable().aspectRatio(contentMode: .fit)
            .frame(width: 100, height: 100)
            .scaleEffect(isDetectingPress ? 0.5 : 1)
            .animation(.easeInOut(duration: 0.2))
            .gesture(LongPressGesture(minimumDuration: 0.01).sequenced(before:DragGesture(minimumDistance: 100).onEnded {_ in
                print("Ended")
            })
                .updating($isDetectingPress) { value, state, _ in
                    switch value {
                    case .second(true, nil):
                        state = true
                        // The message below should be printed when I release the long press
                        print("pressed")
                    case .second(true, _):
                        state = false
                        break
                    default:
                        break
                    }
            })
    }
}

person xmetal    schedule 01.08.2020    source источник
comment
Непонятно, чего вы пытаетесь добиться? А зачем тебе minimumDistance: 100?   -  person Asperi    schedule 01.08.2020
comment
DragGesture(minimumDistance: 0) был необходим для сохранения состояния до тех пор, пока вы не продолжите движение, но он вызвал onEnded сразу после отпускания пальца (ваш нажатый случай), но теперь он ждет перетаскивания на 100 и не работает, поэтому нет onEnded. Не могли бы вы вместо этого объяснить поведение?   -  person Asperi    schedule 01.08.2020
comment
Мне в основном нужно выполнить действие, когда LongPressGesture закончился, но на минимальном расстоянии. Если я выйду за пределы предельного расстояния, мне больше не нужно будет выполнять это действие. Предположим, у меня есть это изображение мусора, и я нажимаю на него, но позже я понял, что мне не нужно отпускать палец, чтобы выполнить действие ... Я бы просто убрал палец с этого изображения и ожидал, что не выполню действие, которое я ожидал   -  person xmetal    schedule 01.08.2020
comment
@xmetal Почему бы вам не использовать вместо этого Button (с изображением внутри)?   -  person pawello2222    schedule 01.08.2020
comment
Это действительно стандартное поведение кнопки   -  person Asperi    schedule 01.08.2020
comment
@ pawello2222 Тогда как мне заставить его работать с помощью кнопки? Я думаю, вы поняли, чего я хочу добиться, но, поскольку я не знаю, как сделать это с изображением, это будет то же самое для кнопки, я думаю   -  person xmetal    schedule 01.08.2020
comment
@ Аспери это правда? тогда мне просто нужно масштабировать изображение внутри кнопки, и если я уберу палец, жест завершится?   -  person xmetal    schedule 01.08.2020


Ответы (1)


Вы можете попробовать следующее:

struct ContentView: View {
    var body: some View {
        Button(action: {
            print("Pressed")
        }) {
            Image(systemName: "trash")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 100, height: 100)
        }
        .buttonStyle(ScalableButtonStyle())
    }
}

struct ScalableButtonStyle: ButtonStyle {
    let scaleWhenPressed: CGFloat = 0.75

    func makeBody(configuration: Configuration) -> some View {
        configuration.label
            .scaleEffect(configuration.isPressed ? scaleWhenPressed : 1.0)
    }
}
person pawello2222    schedule 01.08.2020
comment
Я такой тупой ... Я не знал, что это просто поведение кнопки. Это именно то, что я искал - person xmetal; 01.08.2020
comment
Я просто сосредоточился на изображении, не осознавая, что могу сделать это с помощью кнопки - person xmetal; 01.08.2020
comment
@xmetal Не волнуйся. Мы все делаем ошибки :) Вот как мы учимся. - person pawello2222; 01.08.2020
comment
Моя любимая цитата :) brainyquote.com/quotes/oscar_wilde_105029 - person Adrian; 01.08.2020