10

我只有一个普通的 UITableView,我运行了这个代码:

UITableView *tableView = [[UITableView alloc] init];
for(UIGestureRecognizer *gesture in tableView.gestureRecognizers)
 {
   NSString *className = NSStringFromClass([gesture class]);
   NSLog(@"ClassName:%@", className);
 }

其中一条输出线是:ClassName:UIGobblerGestureRecognizer

令人惊讶的是,谷歌对此一无所知。有人知道它是什么吗?

4

5 回答 5

7

这很可能是 Apple 使用的内部类。我遇到过 Apple 为某些特定用途创建的 UIGestureRecognizers 的自定义子类。我确信他们出于各种原因需要创建自定义手势识别器,就像我一样,并不是所有这些类都公开供我们使用。

于 2012-04-27T17:39:10.680 回答
2

我非常确定它用于在特定单元格显示删除确认按钮时防止正常交互,并将任何触摸识别为触发该单元格返回到非编辑状态。

它有这个方法,我假设 excludeView 是显示删除确认按钮的单元格,因为您通常仍然可以与处于此状态的单元格进行交互。

- (id)initWithTarget:(id)arg1 action:(SEL)arg2 excludedView:(id)arg3;

https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UIGobblerGestureRecognizer.h

于 2013-11-07T03:30:19.553 回答
2

查看http://oleb.net/blog/2013/02/new-undocumented-apis-ios-6-1/

BJ Homer 认为 UIGobblerGestureRecognizer 用于在动画进行时避免识别。否则,它是不活动的。在一次有趣的 Twitter 对话中,Filippo Bigarella 和 Conrad Kramer 发现 UIGobblerGestureRecognizer 可以“吞噬”触摸,以防止其他手势识别器在某些情况下接收到它们。那些是什么情况,我不知道。

于 2013-10-16T19:45:16.273 回答
2

简而言之,从我读过的内容和我的实验结果来看,当状态转换(由用户的触摸或滑动启动)时,“gobbler”似乎会吞噬并触摸表格视图(实际上是表格单元格)正在进行中,以便在用户再次触摸表格之前完成状态转换。Apple 可能会在其他情况下使用它,但它是在我观察到 gobblers 的表格视图中。

现在长话短说:假设您的表格视图在表格单元格上实现了一个“抽屉”,例如 Apple 的邮件应用程序或消息应用程序。当您向后滑动打开抽屉并对抽屉中的任何按钮进行操作时,一切都很好。但是,如果您只是通过第四次滑动来关闭平局,您可能会发现您在随机单元格上的下一次向后滑动不起作用。但是,如果您继续向后滑动,下一次滑动通常会再次显示抽屉。简单地说,如果你只是通过滑动打开和关闭随机单元格上的抽屉,你会发现有时抽屉打不开。

我在我的桌子上看到这种行为,并认为我做错了什么。我尝试了很多东西,最终实现了我自己的 UITableView 子类,它也支持 UIGestureRecognizerDelegate。在我的子类中,我实现了委托的 shouldBeRequiredToFailByGestureRecognizer 函数,只是为了打印出 gestureRecognizer 和 otherGestureRecognizer 对。然后我发现,当识别到向后滑动时,成对中不存在 gobbler。但是,当背面滑动不起作用时,gobbler 肯定是存在的。

网络上的普遍看法是,使用 gobbler 来防止用户在一个转换已经在进行时在桌子上引起另一个状态转换。如果用户确实采取了一些行动(通过触摸抽屉中的按钮),那很好。但是当用户刚刚关闭抽屉时,gobbler 应该被取消。或者仅当用户采取行动时才应添加 gbbler。在我意识到之后,我继续尝试我对 Apple 应用程序的理论。我已经知道邮件应用程序可以完美响应每次滑动。但是消息应用程序会间歇性地重复抽屉打开滑动,就像我的应用程序一样。所以我猜 Mail 的开发者会更加小心,并使用内部知识来做对。我的观察是在 iPhone 6 和 iPad 2 上的 iOS 8.4 上完成的。

于 2015-07-27T15:10:10.583 回答
1

它绝对应该是私有 API 的一部分 ..

我会建议远离它

于 2012-04-27T17:39:19.817 回答