在滑动另一个 UIView 时禁用一个 UIView 上的用户交互
Disable user interaction on one UIView as the other UIView is swiped
在任何开始之前,我知道yourView.userInteractionEnabled = NO;
是一个选项,但让我先解释一下情况。
我有这 2 个 UIView
对象,stoneOne
和 stoneTwo
。我有 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 或其他游戏驱动的开发平台,所以我的一切都来自即时思考。
有多种解决方案,但这里有一个特别简单的解决方案:
从石头中移除滑动手势识别器并将它们附加到石头的公共超级视图。这解决了这个问题,因为在同一视图上只有一个手势识别器会在任何时候识别。
当然,您现在必须使用命中测试来找出正在滑动的石头(如果有的话)。但这是一个简单的实现细节,而且付出的代价很小。
当然,另一个很酷的功能是您现在总共只需要四个手势识别器!
在任何开始之前,我知道yourView.userInteractionEnabled = NO;
是一个选项,但让我先解释一下情况。
我有这 2 个 UIView
对象,stoneOne
和 stoneTwo
。我有 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 或其他游戏驱动的开发平台,所以我的一切都来自即时思考。
有多种解决方案,但这里有一个特别简单的解决方案:
从石头中移除滑动手势识别器并将它们附加到石头的公共超级视图。这解决了这个问题,因为在同一视图上只有一个手势识别器会在任何时候识别。
当然,您现在必须使用命中测试来找出正在滑动的石头(如果有的话)。但这是一个简单的实现细节,而且付出的代价很小。
当然,另一个很酷的功能是您现在总共只需要四个手势识别器!