我正在写一个棋盘游戏应用程序(如国际象棋)。主视图可识别在其全屏视图中的任何位置启动的滑动手势 (UISwipeGestureRecognizer),这会使板旋转。
现在我在板上添加了一个方形透明子视图。这是一个检测触摸的 UIControl 子类 - 作为棋子在棋盘上的移动:
[self.view addSubview:self.boardControl]
我预计滑动手势将在 UIControl 子类覆盖的屏幕区域被阻止。他们不是。因此,当我在方形 boardControl 上快速触摸并拖动(滑动)时,它首先被检测为棋子移动,然后再次被检测为旋转板的滑动。
如何使我的 UIControl 子类阻止在其框架中启动的触摸事件流到其父视图?
我可以通过在超级视图级别过滤触摸来阻止我的应用程序对滑动手势做出反应,方法是:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
CGPoint location = [gestureRecognizer locationInView:self.view];
CGRect frame = self.boardControl.frame;
if ( CGRectContainsPoint(frame, location) )
return NO;
return YES;
}
或通过:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldReceiveTouch:(UITouch *)touch
{
CGPoint location = [touch locationInView:self.view];
CGRect frame = self.boardControl.frame;
if (CGRectContainsPoint(frame, location))
return NO;
return YES;
}
但我想更早地解决这个问题:我希望 boardControl 在其框架触摸事件中不传递任何开始,在视图层次结构中更高。
UIControl 子类可以“覆盖”它的父视图,并“吃掉”它获得的所有触摸,因此父视图不需要访问它的框架来猜测是否必须过滤掉这样的触摸?