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()before onTapGesture()를 사용 하면 후자를 무시합니다.
Koraktor

여기에는 코드를 두드 리거나 누르거나 차단하는 애니메이션이 없습니다.action
Faruk

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

Hi Kilian 사실 나는 이미 longPress 제스처를 추가하려고 시도했지만 여전히 길게 누르지 않고 "일반 클릭"동작 만 "실행"한다고 언급 했어야합니다. 내 게시물을 편집하여 추가하십시오 (두 번째 사람이므로 제안한 사람이 첫 번째 답변을 삭제했습니다).
Gerard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.