스크롤 뷰와 그 안에 하위 뷰가 있습니다. 사용자가 해당 하위보기에서 특정 터치를 수행하면 사용자가 스크롤보기 이동에 방해받지 않고 하위보기에서 작업을 수행 할 수 있도록 스크롤보기가 이동하는 것을 방지하고 싶습니다. 특정 터치가 감지되지 않으면 scrollview가 정상적으로 이동해야합니다.
나는 원시 터치 이벤트와 제스처를 차단 touchesBegan
, touchesMoved
. 제스쳐 인식자를 사용하지 않습니다. 제가 인식하고 싶은 제스쳐가 매우 구체적이고, 추상 레이어를 사용하지 않는 것이 더 편하기 때문입니다.
나는 많은 답변을 본 후에 스크롤 뷰의 참조를 뒤로 잡고 제스처를 감지하면 움직임을 멈출 수 있다는 것을 알고 있습니다. 더 안정적인 솔루션을 찾고 있습니다. 이러한 뷰의 참조를 뒤에 유지하지 않고도 제스처를 감지하면 이벤트 (뒤에있는 모든 뷰로) 전파를 중지하고 싶습니다.
내가 이해했듯이 iOS의 뷰는 UIResponder의 하위 클래스입니다. UIKit이 화면에서 터치를 감지하면 일반적으로 최상위 하위보기 인 첫 번째 응답자에게 이벤트를 제공합니다. 내 질문은 touchesBegan
UIKit에게 "응답자 체인의 다른 다음 뷰로 이벤트를 보내지 마십시오"라고 말하는 방법입니다. 나는 뒤에 이동있는 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에서 어떻게할까요?
해결책을 찾았습니다. 이것은 이해하기 까다 로웠 기 때문에 누군가 같은 문제가 있으면 쉽게 만들려고 노력할 것입니다.
다른 SO 답변에서 언급했듯이 "원시 터치 시스템"( touchesBegen
, touchesMoved
..) 및 "제스처 인식 시스템"은 상호 배타적이며 둘 다 실제로 "원시"뷰 수준에 있으며 독립적입니다.
즉, 뷰가 있고 터치 할 때 원시 터치 시스템 대신 gestureRecognizer 시스템에서 터치를 처리 할 수 있습니다 . UIKit 이 원시 터치 시스템에서 이벤트를 전달하지 않도록 강제로 next
UIResponder 속성을 재정의 하면 시스템이 완전히 떨어져 있기 때문에 뒤에있는 뷰의 제스처 인식이 여전히 실행됩니다.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] 삭제
몇 마디 만하겠습니다