我正在开发 iPhone(iOS 4.0 或更高版本)应用程序,并且在多个视图之间进行触摸处理时遇到一些问题。我有这样的视图结构
---> A superView
|
---> SubView - A
|
---> SubView - B (exactly on top of A, completely blocking A).
基本上我有一个超级视图,以及同级子视图 A 和 B。B 与 A 具有相同的框架,因此完全隐藏 A。
现在我的要求是这样的。
- 子视图 B 应接收所有滑动和点击(单次和双次)
手势。
- 子视图 A 应该接收所有捏合手势。
这就是我向视图添加手势识别器的方法
UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(leftSwipe:)];
[leftSwipe setDirection:(UISwipeGestureRecognizerDirectionLeft)];
leftSwipe.delegate = self;
[bView addGestureRecognizer:leftSwipe];
[leftSwipe release];
UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(rightSwipe:)];
[rightSwipe setDirection:(UISwipeGestureRecognizerDirectionRight)];
rightSwipe.delegate = self;
[bView addGestureRecognizer:rightSwipe];
[rightSwipe release];
UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)];
pinch.delegate = self;
[aView addGestureRecognizer:pinch];
[pinch release];
我做了一些研究,对我来说UIGestureRecognizerDelegate
看起来很有希望,我实现了委托方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
我为子视图 B 返回了“否”,希望底层视图能够获取这些事件。但没有这样的运气
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]] && [gestureRecognizer view] == bView) {
NSLog(@"pinchGesture");
//bView.userInteractionEnabled = NO;
return NO;
}
return YES;
}
然后,当识别捏合手势时,我在委托回调内禁用了子视图 B 的用户交互(上面块中的注释代码),希望子视图 A 能够接收到手势的剩余部分。也没有这样的运气。
这就是我现在的立场。我见过this https://stackoverflow.com/questions/6175255/uigesturerecognizer-receive-touch-but-forward-it-to-uicontrol-as-well问题,其中接受的答案涉及财产cancelsTouchesInView
。但我相信cancelsTouchesInView
只取消特定的触摸事件,不转发它。
还有其他方法可以达到我的要求吗?我已准备好根据您提供的任何提示进行工作。
编辑:赏金时间
我所谓的 subView A 实际上是第 3 方库的 View 类的实例,它取消了所有触摸,并且我无法控制其上的任何手势。我想要左右滑动的不同实现,并且我想要捏合、点击等工作,就像使用第三方视图一样。所以我在 A 之上放置了一个视图(子视图 B)以实现左右滑动。但现在我想将其他手势事件转发到底层库。