在iOS5
中,我在我已在多个地方实施UIViewController
的应用中使用UITouchGesture
遏制。
当我添加一个孩子ViewController
(全屏)时,触摸会传递给其父级。
如果有的话,解决这个问题的方法是什么。我使用MPFlipViewController
,当用户将手指移过孩子ViewController
时,我可以看到该页面在孩子下方转动。
为了澄清,我将我的ViewController添加为具有以下内容的子项:
[self addChildViewController:vc];
[vc willMoveToParentViewController:nil];
[self.container addSubview:vc.view];
[vc didMoveToParentViewController:self];
容器只是一个UIView,它是childViewController&其他UIView对象坐在上面。 感谢
答案 0 :(得分:6)
你已经倒退了。控制器包含是一回事,但这只是标准的视图层次结构和响应者链的东西。所以触摸最初发送给父母;特别是对其观点-(UIView *)hitTest:withEvent:
进行了调用。如果可以找到,则返回子视图。否则它返回自己的一个视图。可能它会自行返回。
如果父控制器正在捕获触摸,则意味着它从未被发送给孩子。并不是说它被发送给孩子然后上升到父母。
如果您希望父母使用触摸捕获做一些不寻常的事情,那么只需使用自定义视图并实现您自己的-hitTest:withEvent:
。作为第一步,执行此操作并记录输入以查看发生的情况。
答案 1 :(得分:1)
在iOS 7发布之前,这是不可能的,我想知道现在是否有任何大师完成这项工作。
答案 2 :(得分:1)
您应该为子视图控制器实现触摸处理。允许孩子捕获所有触摸事件,然后将其删除,以便他们不会传递给父母。
另一个解决方案可能是将您的子视图控制器包装在UINavigationController
中,这可能会让您免费获得该行为。
从父视图控制器发布UITouchGesture
代码可能会有所帮助。
答案 3 :(得分:1)
在MPFlipViewController.m
中你应该看一下这个方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// don't recognize simultaneously with scroll view gestures in content area
if ([[otherGestureRecognizer view] isKindOfClass:[UIScrollView class]])
return NO;
// Allow simultanoues pan & swipe recognizers
return YES;
}
将其更改为
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// don't recognize simultaneously with scroll view gestures in content area
if ([[otherGestureRecognizer view] isKindOfClass:[UIScrollView class]])
return NO;
if (otherGestureRecognizer == GestureRecognizerOfYourChildViewController)
return NO;
// Allow simultanoues pan & swipe recognizers
return YES;
}
当然,GestureRecognizerOfYourChildViewController是您的子视图控制器的手势识别器。
编辑:由于OP没有在自己的子视图控制器上使用手势识别器,因此解决方案略有不同。我会在这里留下第一个版本,因为它可能对有类似问题的其他人有帮助。我能想到的最佳解决方案是,当显示子视图控制器时,需要在MPFlipViewController
中禁用gestureRecognizers,并在删除子视图控制器时再次启用它们MPFlipViewController
再次登顶。请使用enabled
属性。
手势识别器在您自己的视图控制器中使用的“触摸链”之外工作,这就是您的问题发生的原因。