Swift에서 뒤에있는 뷰로의 터치 이벤트 전파 중지

Jerem Lachkar

스크롤 뷰와 그 안에 하위 뷰가 있습니다. 사용자가 해당 하위보기에서 특정 터치를 수행하면 사용자가 스크롤보기 이동에 방해받지 않고 하위보기에서 작업을 수행 할 수 있도록 스크롤보기가 이동하는 것을 방지하고 싶습니다. 특정 터치가 감지되지 않으면 scrollview가 정상적으로 이동해야합니다.

나는 원시 터치 이벤트와 제스처를 차단 touchesBegan, touchesMoved. 제스쳐 인식자를 사용하지 않습니다. 제가 인식하고 싶은 제스쳐가 매우 구체적이고, 추상 레이어를 사용하지 않는 것이 더 편하기 때문입니다.

나는 많은 답변을 본 후에 스크롤 뷰의 참조를 뒤로 잡고 제스처를 감지하면 움직임을 멈출 수 있다는 것을 알고 있습니다. 더 안정적인 솔루션을 찾고 있습니다. 이러한 뷰의 참조를 뒤에 유지하지 않고도 제스처를 감지하면 이벤트 (뒤에있는 모든 뷰로) 전파를 중지하고 싶습니다.

내가 이해했듯이 iOS의 뷰는 UIResponder의 하위 클래스입니다. UIKit이 화면에서 터치를 감지하면 일반적으로 최상위 하위보기 인 첫 번째 응답자에게 이벤트를 제공합니다. 내 질문은 touchesBeganUIKit에게 "응답자 체인의 다른 다음 뷰로 이벤트를 보내지 마십시오"라고 말하는 방법입니다. 나는 뒤에 이동있는 ScrollView를 볼 수 있다면, UIKit가에 이벤트를 전달해야합니다 (I 호출 아니에요에도 불구하고 super에서 touchesBegan)

예를 들어 안드로이드에서 onTouchEvent의 기능 View클래스는 부울을 반환합니다. false는 Android에 이벤트 전파를 계속하도록 지시하고 true는 전파를 중지하도록 지시합니다. iOS에서 동일한 메커니즘을 찾고 있습니다.

@Override
public boolean onTouchEvent(MotionEvent e)
{
    return true ; // stops propagation 
}

Javascript (jQuery)에는 매우 동일한 메커니즘이 있습니다.

$('#myview').bind('click', function(e) {
    e.stopPropagation() 
})

Swift에서 어떻게할까요?

Jerem Lachkar

해결책을 찾았습니다. 이것은 이해하기 까다 로웠 기 때문에 누군가 같은 문제가 있으면 쉽게 만들려고 노력할 것입니다.

다른 SO 답변에서 언급했듯이 "원시 터치 시스템"( touchesBegen, touchesMoved..) 및 "제스처 인식 시스템"은 상호 배타적이며 둘 다 실제로 "원시"뷰 수준에 있으며 독립적입니다.

즉, 뷰가 있고 터치 할 때 원시 터치 시스템 대신 gestureRecognizer 시스템에서 터치를 처리 할 수 ​​있습니다 . UIKit 이 원시 터치 시스템에서 이벤트를 전달하지 않도록 강제로 nextUIResponder 속성을 재정의 하면 시스템이 완전히 떨어져 있기 때문에 뒤에있는 뷰의 제스처 인식이 여전히 실행됩니다.override var next:UIResponder? { get { return nil }}

제 경우에는 다음과 같이 노력했습니다 override var next:UIResponder? { get { return nil }}. touchesBegan뒤에있는 관점은 예상대로 조용했지만 여전히 거기에서 제스처를 인식 할 수있었습니다.

따라서 UIScrollView는 사용자 터치를 처리하기 위해 gestureRecognizer를 사용하는 것으로 보입니다. 해결책은 제스처가 전달되지 않도록 최상위 뷰에서 제스처 인식기 시스템을 종료하는 것입니다. 다음을 사용하여 수행 할 수 있습니다.

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool 
{
    return !yourConditionToShutDownGR
}

Android의 제스처 "감지기"시스템이 원시 터치 시스템 위에 구축 되었기 때문에 혼란 스러웠습니다 . 터치 이벤트를 잡을 때 public boolean onTouchEvent(MotionEvent event)제스처를 찾았는지 여부를 반환하는 gestureDetector의 매개 변수로 전달할 수 있습니다. 이는 gestureRecognizer 시스템이 원시 터치 시스템과 별도로 구축되는 iOS와 동일한 접근 방식이 아닙니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

모든 장치에서 클릭 이벤트로 터치 장치의 터치가 감지됩니까?

분류에서Dev

UIViewControllerRepresentable에서 View behind로 터치 이벤트를 전달하는 SwiftUI

분류에서Dev

Swift-두 번째 UIWindow의 일부인 여러 버튼에 터치 이벤트를 전달하지만 다른 모든 것은 무시하는 방법

분류에서Dev

ajax onchange 이벤트를 통해 laravel 뷰에서 컨트롤러로 데이터 전달

분류에서Dev

Javascript-버블 링 / 전파에서 모달 키보드 이벤트 중지

분류에서Dev

내 뷰 컨트롤러의 여러 뷰에서 터치 이벤트를 감지하는 방법은 무엇입니까?

분류에서Dev

스크롤 뷰 사이에 터치 이벤트 전달

분류에서Dev

Leaflet에서 '클릭'이벤트 전파 중지

분류에서Dev

로드되기 전에 생성자 또는 이벤트에서 페이지로드를 중지하는 방법

분류에서Dev

뷰 엔진에서 위치를 지정할 때 뷰 시작 파일에 레이아웃의 전체 경로가 필요한 이유는 무엇입니까?

분류에서Dev

서브 뷰에 대한 터치 이벤트 수신

분류에서Dev

ng-transclude는 Angular.js에서 이벤트 전파를 중지합니까?

분류에서Dev

Bonsai.js에서 이벤트 전파 중지

분류에서Dev

Laravel의 뷰에서 컨트롤러로 데이터 전달

분류에서Dev

다른 뷰 뒤에서 터치 이벤트를받는 방법은 무엇입니까?

분류에서Dev

터치 이벤트에서 뷰가 "눌리지"않도록하는 방법

분류에서Dev

사용자 정의보기에서 ViewPager로 터치 이벤트 전달

분류에서Dev

Android : 어댑터의 터치 이벤트에서 GridView의 이미지 업데이트

분류에서Dev

Ionic에서 터치 이벤트 데이터를받지 못함

분류에서Dev

Swift의 ONE ViewController에서 뷰간에 데이터 전달

분류에서Dev

이미지 ID는 위치를 getItemId에 전달하여 이러한 방식으로 OnClick 이벤트에서 전달할 수 있습니까?

분류에서Dev

컨트롤러에서 laravel 중첩 뷰로 데이터 전달

분류에서Dev

codenameone에서 장치 뒤로 버튼 이벤트를 감지하는 방법

분류에서Dev

Android의 터치 이벤트에서 이미지보기가 이동 한 후 알파 애니메이션이 이상하게 작동합니다.

분류에서Dev

iOS Swift : tableView에서 뷰 컨트롤러로 데이터 전달

분류에서Dev

터치시 전체 화면 이벤트가 Chrome에서 작동하지 않음

분류에서Dev

AngularJS의 한 뷰에서 다른 뷰로 데이터를 전달하는 방법

분류에서Dev

클릭 핸들러에서 이벤트 전파 중지

분류에서Dev

HTTP 요청에서 Swift 3의 다른 뷰 컨트롤러로 JSON 데이터 전달

Related 관련 기사

  1. 1

    모든 장치에서 클릭 이벤트로 터치 장치의 터치가 감지됩니까?

  2. 2

    UIViewControllerRepresentable에서 View behind로 터치 이벤트를 전달하는 SwiftUI

  3. 3

    Swift-두 번째 UIWindow의 일부인 여러 버튼에 터치 이벤트를 전달하지만 다른 모든 것은 무시하는 방법

  4. 4

    ajax onchange 이벤트를 통해 laravel 뷰에서 컨트롤러로 데이터 전달

  5. 5

    Javascript-버블 링 / 전파에서 모달 키보드 이벤트 중지

  6. 6

    내 뷰 컨트롤러의 여러 뷰에서 터치 이벤트를 감지하는 방법은 무엇입니까?

  7. 7

    스크롤 뷰 사이에 터치 이벤트 전달

  8. 8

    Leaflet에서 '클릭'이벤트 전파 중지

  9. 9

    로드되기 전에 생성자 또는 이벤트에서 페이지로드를 중지하는 방법

  10. 10

    뷰 엔진에서 위치를 지정할 때 뷰 시작 파일에 레이아웃의 전체 경로가 필요한 이유는 무엇입니까?

  11. 11

    서브 뷰에 대한 터치 이벤트 수신

  12. 12

    ng-transclude는 Angular.js에서 이벤트 전파를 중지합니까?

  13. 13

    Bonsai.js에서 이벤트 전파 중지

  14. 14

    Laravel의 뷰에서 컨트롤러로 데이터 전달

  15. 15

    다른 뷰 뒤에서 터치 이벤트를받는 방법은 무엇입니까?

  16. 16

    터치 이벤트에서 뷰가 "눌리지"않도록하는 방법

  17. 17

    사용자 정의보기에서 ViewPager로 터치 이벤트 전달

  18. 18

    Android : 어댑터의 터치 이벤트에서 GridView의 이미지 업데이트

  19. 19

    Ionic에서 터치 이벤트 데이터를받지 못함

  20. 20

    Swift의 ONE ViewController에서 뷰간에 데이터 전달

  21. 21

    이미지 ID는 위치를 getItemId에 전달하여 이러한 방식으로 OnClick 이벤트에서 전달할 수 있습니까?

  22. 22

    컨트롤러에서 laravel 중첩 뷰로 데이터 전달

  23. 23

    codenameone에서 장치 뒤로 버튼 이벤트를 감지하는 방법

  24. 24

    Android의 터치 이벤트에서 이미지보기가 이동 한 후 알파 애니메이션이 이상하게 작동합니다.

  25. 25

    iOS Swift : tableView에서 뷰 컨트롤러로 데이터 전달

  26. 26

    터치시 전체 화면 이벤트가 Chrome에서 작동하지 않음

  27. 27

    AngularJS의 한 뷰에서 다른 뷰로 데이터를 전달하는 방법

  28. 28

    클릭 핸들러에서 이벤트 전파 중지

  29. 29

    HTTP 요청에서 Swift 3의 다른 뷰 컨트롤러로 JSON 데이터 전달

뜨겁다태그

보관