많은 질문을 한 후이 문제가있는 다른 사용자와 Apple의 게시판에 대한 토론을 발견했습니다 : Issues with UITapGestureRecognizer (개발자 계정 필요). 나는 계속해서 버그 보고서를 제출했다 : 15331126 (더 이상 버그 보고서에 연결하는 방법을 아는 사람이 있습니까?). 그동안이 해결 방법을 구현했습니다. 지금까지는 작동하는 것처럼 보이지만 버그가 너무 드물기 때문에 아직 트리거하지 않았을 수 있습니다. 나는 그것을 베타 사용자들에게 공개 할 것이고, 그들로부터 아무런 불만이 없다면 (불평하고있는) 나는이 문제를 수정한다고 생각할 것이다.
는 UPDATE : 이 해결책은 문제를 해결하고있다. 수십 명의 사용자가 몇 주 동안 사용하고 나면 제스처에 대해 한 가지 문제가 발생하지 않았습니다.
대부분 제 제스처는 관습입니다. 나는 자신의 대표와 수를 변경 구현 : (이유는 아래에서 볼 수, 공개적으로) 내 사용자 지정 gestureRecognizers 이제 UIGestureRecognizerDelegate 프로토콜을 구현
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
if (gestureRecognizer == self){
if ([otherGestureRecognizer isMemberOfClass:self.class]){
if ([self isGestureRecognizerInSuperviewHierarchy:otherGestureRecognizer]){
return YES;
} else if ([self isGestureRecognizerInSiblings:otherGestureRecognizer]){
return YES;
}
}
}
return NO;
}
참고.
- (BOOL) isGestureRecognizerInSiblings:(UIGestureRecognizer *)recognizer{
UIView *superview = self.view.superview;
NSUInteger index = [superview.subviews indexOfObject:self.view];
if (index != NSNotFound){
for (int i = 0; i < index; i++){
UIView *sibling = superview.subviews[i];
for (UIGestureRecognizer *viewRecognizer in sibling.gestureRecognizers){
if (recognizer == viewRecognizer){
return YES;
}
}
}
}
return NO;
}
- (BOOL) isGestureRecognizerInSuperviewHierarchy:(UIGestureRecognizer *)recognizer{
if (!recognizer) return NO;
if (!self.view) return NO;
//Check siblings
UIView *superview = self.view;
while (YES) {
superview = superview.superview;
if (!superview) return NO;
for (UIGestureRecognizer *viewRecognizer in superview.gestureRecognizers){
if (recognizer == viewRecognizer){
return YES;
}
}
}
}
내가 난 단지 문제가 수퍼 제스처 발생 보았 듯이 형제를 확인 할 필요가 전혀 확실하지 않다 : 나는 또한 (위의 코드에서 사용) UIGestureRecognizer에 범주의 몇 가지를 추가했다. 그러나 나는 그 기회를 포기하고 싶지 않았다. 현재 뷰의 "위"에있는 뷰 제스처를 취소하고 싶지 않기 때문에 현재의 "아래"형제 만 확인합니다.
나는 사용자 지정 인식기의 대표로 자신을 설정하는 클래스에 대한 구현을 추가했지만, 그들은 거의 바로 다시 gestureRecognizer에 호출이 다른 사람이 문제를 가지고하는 데 도움이
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
if ([gestureRecognizer respondsToSelector:@selector(gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer:)]){
return [(id <UIGestureRecognizerDelegate>)gestureRecognizer gestureRecognizer:gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:otherGestureRecognizer];
}
return NO;
}
희망.
모선에서 의견이 있으십니까? 주문을 수립하기위한 더 명확한 방법/프로토콜을 갖는 것이 더 좋을 것입니다. (그리고 귀하의 게시물에 대한 감사) –
아니, 정말로. 내가 제출 한 레이더는 결국 의도 된 행동으로 제거되었습니다. 그러나 최근 버전의 iOS에서 팝업 문제를 보지 못했기 때문에 내부적으로 수정 된 것으로 의심됩니다. –
좋은 물건! 나는 지금 내가 묘사하고있는 버그가 어떻게 정상인에게 합리적이라고 생각할 수 없었는지에 대한 긴 머리말을하고 기대했던 것이 정확한 것과 같은 것이 아님을 분명히하려고 노력하고있다. 나는 또한 버그가 예상대로 돌아 왔고, 나중에 수정되었는데 - 어떻게되는지는 확실치 않습니다. 한번 더 위반에! ;-) –