iOS:如何允许所有手势/事件*以及几个例外*通过顶级视图传递到其子视图

时间:2012-05-21 11:36:35

标签: iphone objective-c ios cocoa-touch

我有一个非典型的iOS界面。也许它不实用,但我可以试一试。希望有人可以帮忙!

我有一个UIVIew形式的菜单。它包含5个小的UIImageViews。 UIPinchGestureRecognizer附加到UIVIew。当向内收缩时,5个UIImageViews从屏幕外动画,在窗口中间形成一个圆圈。当向外挤压时,它们会在屏幕外动画。那里的一切都很棒。

我希望能够在应用程序的任何位置捏住屏幕以显示菜单,然后选择其中一个按钮' (UIImageView),并加载相关的子视图。

真正的问题是,如果当前可见视图是UIScrollView或UITableView,我的应用程序无法确定菜单或其他子视图是否应该处理触摸事件。如果我真的专注并确保两个手指在同一时间触摸屏幕,则捏合将起作用并向内拉动菜单。但除此之外,它会尝试滚动当前的可见视图。

我希望除捏合手势以外的所有事件(以及菜单可见时的点击手势)都可以通过菜单视图传递到其他子视图。

我知道我可以覆盖hitTest:withEvent方法来确定处理事件的正确视图,但我现在还不清楚如何使用它。苹果文档和我在堆栈溢出上读到的任何答案都没有让我明白这个方法。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

由于UITableView是UIScrollView的子类,因此它继承了所有UIScrollView的属性,包括其手势识别器。

UIScrollView声明了UIPinchGestureRecognizer和UIPanGestureRecognizer。我不确定实现细节,但我想UITableView会禁用捏手势识别器,因为你不应该能够缩放桌面视图!

在任何情况下,您都可以将自己的UIPinchGestureRecognizer附加到表格视图中:

UIPinchGestureRecognizer *yPGR = [[UIPinchGestureRecognizer alloc]
initWithTarget:probablySelf action:yourMenuShowSelectorHere];

UITableView *tv = ...
// ...
[tv addGestureRecognizer:yPGR];

然后,您可以确保UITableView scoll在您的收缩失败之前不会滚动:

[tv.panGestureRecognizer requireGestureRecognizerToFail:yPGR];

这样,UITableView在确定没有检测到夹点之前不会滚动。

编辑:UIScrollView仅在iOS 5及更高版本中使用(或至少声明公共访问)UIGestureRecognizers。