0

내 응용 프로그램에서 사용자가 UIImageView 맵 (.PNG)을 볼 수있는 UIScrollview이 있습니다. UIScrollView은지도 주위의 이동 및 스크롤을 처리하는 데 사용됩니다.scrollview 내에서 이미지 뷰 내부에있는 uibutton을 누르십시오.

터치 할 때지도에 관심 장소 (버튼)를 '추가'할 수있게하려는 경우 UIScrollView에 탭 수신기를 추가했습니다. 온 대신에 (체류를

[plattegrondImageview addSubview:plattegrondPunt]; 

이렇게 소자 스크롤 좋게 따라 이미지 :

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)]; 

[myScrollview addGestureRecognizer:tap]; 

탭이 등록되면 I가있는 UIButton을 만들고 UIScrollView 내부 버튼 께 UIImageView 추가 주어진 좌표). 여태까지는 그런대로 잘됐다.

그러나 이제는 사용자가 '버튼'을 탭한 다음 (예 : 댓글을 입력 할 수있는 팝업 화면 열기) 사용자를 원합니다.

나는 수돗물을 수신하는 버튼에 대상을 추가 한 :

[poi addTarget:self action:@selector(puntTap:) forControlEvents:UIControlEventTouchUpInside]; 

을 이제 문제에 대한 :

사용자 탭 버튼에의 할 때마다

는, 셀렉터 (puntTap)이 제대로 발사한다 , UIScrollview의 기본 탭 제스처가 해고되었습니다.

popover보기가 열릴뿐만 아니라 여분의 UIButton 요소가 화면에 표시됩니다.

UIScrollview도 탭을 등록한다는 것은 논리적이지만,이 경우 원하지 않는 동작입니다. 사용자가 scrollview 안에 UIButton을 두 드릴 때마다 scrollview 자체가 응답해서는 안됩니다.

시각화 레이어 :

->UIScrollview

----->UIImageView

---------->UIButton

나는 이미 scrollview에 대해 다음 속성을 사용했습니다.

myScrollview.userInteractionEnabled = YES; 
myScrollview.canCancelContentTouches = YES; 
myScrollview.delaysContentTouches = YES; 

나는 내가 그것을 도청 버튼 아닌지 확인하기 위해합니다 (UIScrollview의 탭 제스처 포함) 그러나 hitTest 같은 것을 할 수있는 것 같아요 -하지만 어쩌면 누군가는 '청소기'솔루션을 가지고있다?

을 요약 (아무것도 내가 설정 화면이 방식에 대해 불분명 한 경우, 그렇게 말하십시오) : 사용자가 UIButton에 탭하면, scrollviewGestureRecognizer도 발사!

답변

0

버튼에 대해이 속성을 설정합니다.

myButton.exclusiveTouch = YES; 

이렇게 터치가 아래로보기로 이동하는 것을 방지합니다.

+0

불행히도 트릭을하지 않는 것 같아서 scrollview/tap이 계속 발생합니다. 나는 단추에 그것을 설정했다. 그러나 그 실제로보기는 또한 위의 '터치'를 얻는다. (단추는 마지막으로 아래로보기이다.) – YDL

1

scrollView의 userInteractionEnabled를 uibutton의 False/No touchesbegan으로 설정하고 uu 버튼 touchesEnded에서 다시 사용하도록 설정할 수 있습니다.

다른 옵션을 사용하면 uibutton exclusiveTouch 속성을 YES로 설정할 수 있습니다.

편집 : 위에서 귀하의 의견을 보았습니다. 터치가 스크롤 뷰에서 uibutton으로 전파되는 것 같습니다. 어떤 경우 스크롤보기에서 터치 좌표를 확인하고 버튼이 그 부근에 없으면 새 버튼을 추가해야 할 수도 있습니다 (어쨌든 좋은 아이디어일까요?). 단추 위치를 그대로 저장한다고 가정하면 현재 목록과 비교하면됩니다. (테스트하지)

+0

답을 고맙다! 터치는 실제로 스크롤 뷰에서 전파 된 것 같습니다. (배타적 터치는 눈에 띄는 효과가 없습니다.) - 저는 지금 HitTest로 제안한 것을 정확하게 수행하고 있습니다. 더 나은 아이디어 (성능)) – YDL

1

그냥 생각 :

대신 직접 목표를 설정하는 버튼에 다른 하나를 사용하려고보다, 당신의 GesutureRecognizers에 충실합니다. 그래서 당신은 다른 하나 취소하는 최초의 인식을 설정할 수 있습니다

- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer

또 다른 아이디어는 버튼을 터치하면, 확인 UIScrollView을 하위 클래스 hitTest:을 덮어하는 것입니다.

+0

고맙습니다! 첫 번째 아이디어는 옵션처럼 들리지만, 그렇게 할 때 나는 믿는 버튼 (TouchUpInside 등)에서 표준 터치 이벤트를 잃어 버릴 것입니다 - 저는 두 번째 아이디어를 구현했습니다 (서브 클래 싱하지는 않지만) - 이제 저는 히트 테스트하고 있습니다. 스크롤 뷰의 탭 인식기 내부. 조회 된보기의 유형이 UIButton 인 경우 해당 탭 동작의 추가 프로세스를 취소합니다 (내 단추가 동작을 대신 함). – YDL

+0

예, 제스처 인식기 내의 단추 상태를 유지하여 해당 상태를 유지해야합니다. – calimarkus

0

문제는 응답 체인의 불완전한 구현으로 인해 발생한다고 생각합니다.

tapGestureUIScrollView을 등록 했으므로 수행 된 모든 탭 제스처가 처리됩니다. 그러나 그것도 subviews에서 수행되지만 스스로 처리하지 않는 탭 동작을 처리합니다. 귀하의 경우에는 단추가 하위보기 범주에 속하게됩니다. 즉각적인 superview (imageView)은 이러한 이벤트에 응답하지 않으므로 터치 이벤트는 scrollview로 이동합니다.

그러나 현재, button는 터치 이벤트의 UIControlEventTouchUpInside 유형이 아닌 다른 UIControlEvents는이 경우 UIScrollView에, superview 응답에 전달 될 수 있도록 모든 터치 이벤트에 대해 등록됩니다.

따라서 button handles all types of touch event 인 경우 superview에 처리하도록 요청하지 않습니다.

관련 문제