经过大量搜索后,我发现与其他遇到此问题的用户在 Apple 的留言板上进行了讨论:UITapGestureRecognizer 问题(需要开发人员帐户)。我继续提交了一个错误报告:15331126 (有人知道如何链接到错误报告吗?)。与此同时,我实施了这个解决方法。到目前为止,它似乎正在工作,但由于这个错误非常罕见,我可能根本还没有触发它。我将它发布给我的测试版用户,如果我没有收到他们的投诉(他们一直在抱怨),我会认为这可以解决问题。
更新:
这个解决方案已经解决了这个问题。经过数十名用户的几周使用,我没有遇到过手势问题。
我的大部分手势都是习惯的。我将它们更改为自己的代表并实施:
- (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;
}
请注意,我的自定义手势识别器现在实现了 UIGestureRecognizerDelegate 协议(公开的,原因您将在下面看到)。我还在 UIGestureRecognizer 中添加了几个类别(在上面的代码中使用):
- (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;
}
}
}
}
我不完全确定我需要检查兄弟姐妹,因为我只看到超级视图手势出现问题。然而,我不想抓住这个机会。请注意,我只检查当前视图“下方”的兄弟姐妹,因为我不想取消当前视图“上方”的视图手势。
我必须为那些将自己设置为自定义识别器代表的类添加实现,但它们几乎只是回调手势识别器:
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
if ([gestureRecognizer respondsToSelector:@selector(gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer:)]){
return [(id <UIGestureRecognizerDelegate>)gestureRecognizer gestureRecognizer:gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:otherGestureRecognizer];
}
return NO;
}
希望这可以帮助其他遇到问题的人。