我想检测从屏幕右下角到中间的两指对角滑动。我尝试添加 UISwipeGestureRecognizer,方向设置为“UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionLeft”,但由于处理程序被调用,即使我从屏幕中间开始向左上角滑动,也无济于事。
我需要继承 UIGestureRecognizer 还是我可以使用 touchesBegan 和 touchesMoved 处理这个问题?
最佳答案
无论如何,您需要将其子类化以使用 touchesBegan
和 touchesMoved
。我会像你说的那样做 UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionLeft
,然后设置两个 CGRect
,一个用于可接受的起点,一个用于可接受的终点。然后使用 UIGestureRecognizerDelegate
方法 gestureRecognizer:shouldReceiveTouch:
,并使用 CGRectContainsPoint()
检查触摸点是否在可接受的起始矩形内。然后(我认为)在您的 UISwipeGestureRecognizer
子类中,覆盖 touchesEnded:withEvent:
,并检查结束触摸是否在可接受的矩形中。如果不是,请将状态设置为 UIGestureRecognizerStateCancelled
(或者您应该取消手势)。还要确保它所附加的 View 设置了 multipleTouchEnabled
属性。我还没有真正尝试过这个,但应该这样做。祝你好运!
编辑
实际上,如果您不想担心可接受的起点/终点的特定矩形值,并使其与设备无关,您可以这样做:
//swap in whatever percentage of the screen's width/height you want in place of ".75f"
//set the origin for acceptable start points
CGFloat startRect_x = self.view.frame.size.width * .75f;
CGFloat startRect_y = self.view.frame.size.height * .75f;
//set the size
CGFloat rectWidth = self.view.frame.size.width - startRect_x;
CGFloat rectHeight = self.view.frame.size.height - startRect_y;
//make the acceptable start point rect
CGRect startRect = CGRectMake(startRect_x, startRect_y, rectWidth, rectHeight);
//set the origin for the accepable end points
CGFloat endRect_x = self.view.center.x - rectWidth/2;
CGFloat endRect_y = self.view.center.y - rectHeight/2;
//make the acceptable end point rect
CGRect endRect = CGRectMake(endRect_x, endRect_y, rectWidth, rectHeight);