2015-02-24 78 views
0

这是一个相当假设的问题,只是为了理解正确的设计,但可以说我有两个自定义的UIViews。正确的UIGestureRecognizer和委托设计

其中之一基本上是我会打电话给一个抽屉的容器。其目的是隐藏和显示内容。这很像iOS上的通知中心,您可以通过滑动将其打开并弹回以关闭它。它是一个通用容器,可以包含任何其他UIView。它有一个UIPanGestureRecognizer来跟踪拉开它的手指。它也可能有一个UISwipeGestureRecognizer来检测“轻弹”。

另一种观点是,具有UIPan /旋转/捏GestureRecognizers定制地图工具。

我认为抽屉视图应该是Pan/Swipe GestureRecognizers的UIGestureRecognizerDelegate,这样它可以防止触摸被传递,除非用户抓住“手柄”。

我的第一个直觉是地图是平移/旋转/捏手势的UIGestureRecognizerDelegate,以便它可以允许它们全部同时运行。

我遇到的问题是,我真的不希望地图接收任何接触或开始识别姿势,直到抽屉是完全开放的。我希望能够在抽屉本身自动执行此行为,以便它可以立即适用于所有子视图。

我能想到做到这一点的唯一方法是将所有的手势处理程序连接到ViewController并让它做所有事情,但是对于打破封装的我来说,它必须知道地图手势需要运行同时,抽屉只能触及它的手柄,并且地图只有在打开时才能触及。

什么是这样做,其中的逻辑可以留在地方意见,我认为它属于的一些方法?

回答

0

我会做这样的事情,使抽屉的同时平移禁用子视图。本质上循环抽屉的子视图和对它们的恶意交互。

[self.subviews enumerateObjectsUsingBlock:^(UIView *subview, NSUInteger idx, BOOL *stop){ 
    subview.userInteractionEnabled = NO; 
}]; 

而且当你想重新启用子视图上的用户交互时,又有类似的东西。

+0

我不能说这个解决方案不起作用,但它不在可用的手势工具中。那是因为Superviews没有适当的方式来控制他们的Subviews手势行为(除了作为代表)吗? – cjserio 2015-02-25 12:23:09

0

这应该已经是Just Work™了。手势识别器附加到视图;当连续手势被识别时,与该手势相关联的所有后续触摸与该视图相关联。

因此,在您的情况下,当识别出抽屉平底锅时,与该平底锅相关的任何触摸都不应该导致您的地图视图的平移/捏合/旋转手势发生行为(除非您明确指定他们应使用适当的委托方法) 。

或者你的意思是你想阻止,中途用户通过打开抽屉,用另一个手指(即另一种姿态)开始滚动(半可见)的地图?如果是这样,您应该在抽屉的contentView(或等效)上设置userInteractionEnabled,将NO设置为UIGestureRecognizerStateBegan/ChangedYES,再次设置为UIGestureRecognizerStateEnded/Cancelled

+0

实际使用情况是,由于从前一手指拖动/滑动给出的速度,抽屉正在移动(没有触摸)的过程中......然后,用户停止抽屉移动并触摸激活地图拖动的地图(小孩)...因此不是停止抽屉关闭,而是平移地图并且抽屉继续关闭。这听起来像你的第3段更适用,你建议的东西非常类似于在他的答案中做的lramirez135。这似乎是有道理的,所以我认为我需要给他信贷。但谢谢你澄清。 – cjserio 2015-03-03 12:38:22