2017-01-03 9 views
0

내 응용 프로그램은 페이지 된 가로 스크롤 뷰를 사용합니다. 각 페이지에는 사용자가 탭할 수있는 UIControls가 있습니다.UIPanGestureRecognizer로 중복 된 UIScrollView 취소 동작

UIScrollView는 터치 및 스 와이프 취소 처리를 잘 처리합니다. 사용자가 충분히 빨리 스 와이프를 시작하면 항상 스 와이프됩니다. 사용자가 강조 표시된 상태를 활성화 할만큼 길게 터치하면 스크롤보기가 스 와이프를 시도하지 않습니다.

UIPanGestureRecognizer 하위 클래스로이 동작을 복제하려고하므로 내 scrollview 내에서 아래쪽으로 스 와이프에 응답 할 수 있습니다. 그러나 UIControls가 강조 표시되는 경우 취소 할 제스처를 얻을 수 없습니다.

지금까지 나는 다음과 같은 짓을했는지 :

self.refreshGesture.cancelsTouchesInView = YES; 
self.refreshGesture.delaysTouchesBegan = NO; 
self.refreshGesture.delaysTouchesEnded = NO; 

이있는 UIScrollView가 접촉을 에 의견을 전달하는 방법을 복제하는 것, 그러나있는 UIScrollView의 팬 제스처 인식기가 취소 도착하는 방식을 복제하지 않습니다. self.refreshGesture은 사용자가 얼마나 천천히 움직 였는지 또는 UIControl의 상태가 어떻든간에 항상 트리거됩니다.

내 제스처에서 대리인을 설정하려고 시도했지만 이것이 가능한 방법 일 수 있습니다. 하지만 나는 그 조합을 찾지 못했습니다. 예를 들어, UIControl에서 터치가 시작되는지 확인하는 것만으로 너무 자주 취소됩니다. 나는 또한 내 컨트롤에서 gestureRecognizerShouldBegin을 무시하려고 시도했지만 해킹처럼 보일뿐 아니라 (UITextView의 제스처를 방해하는) 파급 효과가 있습니다.

이 GIF에서는 컨트롤이 터치로 활성화되고 스크롤 뷰가 스크롤되는 것을 볼 수 있습니다.

enter image description here

답변

0

내가 정확히 복제 할 수 없습니다 만, WWDC 2014 #235가 제안한 두 가지 가능성이 있습니다하지만 내 아래쪽으로 팬 제스처는 같은 방식으로 취소되지 않습니다.

  1. 기본 콘텐츠 위에 투명한 스크롤 뷰를 추가하고 제스처 인식기를 루트보기로 이동하십시오. 이것은 무엇을했다. 그것은 내가 충분하게 끝난 UIScrollViewDelegate을 사용하게했다.
  2. "시간 제한"제스처 인식기를 사용하십시오. 비디오는 타임 아웃 제스처가 실패 할 것을 제안하지만, 제 경우에는 길게 누르는 제스처를 사용하고 긴 누름이 시작되면 내 팬을 취소하는 것이 더 효과적입니다. 0.1 초는 제안 된 0.15 초보다 효과가있는 것처럼 보였습니다.