我正在写一个棋盘游戏应用程序(如国际象棋)。主视图识别滑动手势(UISwipeGestureRecognizer)在其全屏视图中的任何位置启动,这使得电路板旋转。
现在我在电路板上添加了一个方形透明子视图。这是一个UIControl子类,可以检测触摸 - 作为棋盘周围的移动:
[self.view addSubview:self.boardControl]
我预计在UIControl子类覆盖的屏幕区域会阻止滑动手势。他们不是。因此,当我快速触摸并拖动(滑动)在我的方形板控制上时,它首先被检测为典当移动,但随后再次被检测为滑动以旋转板。
如何让我的UIControl子类阻止在其框架中启动的触摸事件流到其超级视图?
我可以阻止我的应用对滑动手势作出反应,通过过滤superview级别的触摸,或者通过:
- (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子类可以“覆盖”它的超级视图,并“吃掉”它获得的所有触摸,因此超级视图不需要访问其帧来猜测是否必须过滤掉这样的触摸?
答案 0 :(得分:0)
您需要的只是实现UIGestureRecognizerDelegate
提供了生成请求内容的方法。
我认为你应该从gestureRecognizer:shouldReceiveTouch:
例子