我正在开发一个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
我为SubView B返回了NO,希望底层视图能够接收到这些事件。但是没有这样的运气。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
if ([gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]] && [gestureRecognizer view] == bView) {
NSLog(@"pinchGesture");
//bView.userInteractionEnabled = NO;
return NO;
}
return YES;
}
然后,在委托回调中禁用了SubView B的用户交互(在上面的代码块中注释掉的代码),当识别到捏手势时,希望剩余部分的手势将被SubView A接收。但是也没有这样的运气...
所以这就是我现在的立场。我看过this问题,其中被接受的答案涉及属性。但我认为只会取消特定的触摸事件,而不会转发它。
有其他方法可以实现我的要求吗?我准备根据您提供的任何提示进行工作。
编辑:赏金时间
我的所谓的subView A实际上是第三方库的View类的一个实例,它接管了所有的触摸操作,我对其上的任何手势都没有控制权。我想要左右滑动的不同实现,并且希望捏、轻敲等手势与这个第三方视图的工作方式完全相同。因此,我在A的顶部放置了一个视图(SubView B)来获取左右滑动。但现在我想将其他手势事件转发到底层库。