在滑动另一个 UIView 时禁用一个 UIView 上的用户交互

Disable user interaction on one UIView as the other UIView is swiped

在任何开始之前,我知道yourView.userInteractionEnabled = NO;是一个选项,但让我先解释一下情况。

我有这 2 个 UIView 对象,stoneOnestoneTwo。我有 4 个 UISwipeGestureRecognizer 对象附加到它们上、下、左和右。想象一下在 5x5 的网格中滑动这些 'stones'。

我不想要的是能够同时滑动。

目前,该错误仍然是一个问题。我将向您展示一个名为 swipeLeft: 的方法,它表示所有滑动方向的布局。

    - (IBAction)swipeLeft:(UISwipeGestureRecognizer *)recognizer {
        _oldMove1 = _move1;
        _oldMove2 = _move2;
        if (recognizer.view == _oneStone
               && recognizer.direction == UISwipeGestureRecognizerDirectionLeft) {
            _twoStone.userInteractionEnabled = NO;
            _oneStone = recognizer.view;
            [self moveOne:CGPointMake(-1, 0) withView:_oneStone];
            self.move1++;
            // 'causeADelay:' runs _twoStone.userInteractionEnabled = YES;
            [self performSelector:@selector(causeADelay:) withObject:_twoStone afterDelay:1];
        } else if (recognizer.view == _twoStone
               && recognizer.direction == UISwipeGestureRecognizerDirectionLeft) {
            _oneStone.userInteractionEnabled = NO;
            _twoStone = recognizer.view;
            [self moveTwo:CGPointMake(-1, 0) withView:_twoStone];
            self.move2++;
            [self performSelector:@selector(causeADelay:) withObject:_oneStone afterDelay:1];
        }
        self.moveCount++;

}

我尝试过的其中一件事是延迟我可以与 UIView 对象交互的时间。仅当我等待半秒钟进行交互时,这才有效。完全延迟会发生,一切都会正常进行。

我的错误是同时滑动它们。那是因为它们附带的滑动手势吗?

我还尝试删除对象并将其重新应用为子视图……显然没有用。我真的需要这个才能工作,否则我就有了一个死胡同。刚开始时我对编码还很陌生,从未想过 Cocos2d 或其他游戏驱动的开发平台,所以我的一切都来自即时思考。

有多种解决方案,但这里有一个特别简单的解决方案:

从石头中移除滑动手势识别器并将它们附加到石头的公共超级视图。这解决了这个问题,因为在同一视图上只有一个手势识别器会在任何时候识别。

当然,您现在必须使用命中测试来找出正在滑动的石头(如果有的话)。但这是一个简单的实现细节,而且付出的代价很小。

当然,另一个很酷的功能是您现在总共只需要四个手势识别器!