我加入到我的主要的UIView子视图(称为panel
),我加入gestureRecognizer它,因为我希望它只是为Y轴,只对一定限度可拖动(即160,300,300就不能去)。
我实现了手势操作这种方式
- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
CGPoint translation = [recognizer translationInView:self.view];
recognizer.view.center = CGPointMake(self.view.frame.size.width/2, recognizer.view.center.y + translation.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view.superview];
//now limit the drag to some coordinates
if (y == 300 || y == 190){
no more drag
}
}
但现在我不知道如何限制拖动到这些坐标。
这不是一个巨大的视图,它包含的工具栏和按钮只是一个小视图。
如何限制拖拽到的坐标? (X = 160(中间画面),Y = 404)< - 例如
应该采取什么中心呢?
我用Google搜索了很多,但我没有找到一个具体的答案。
提前致谢
首先,您需要更改视图的中心之前,执行限制。 您的代码更改视图的检查,如果这个新的中心是出界前中心。
其次,你需要使用正确的C运营商用于测试Y坐标。 该=
运算符是赋值。 该==
平等运营商的测试,但你不希望使用,要么。
第三,你可能不希望重置识别器的翻译,如果新的中心是出界外。 重置转换时的阻力变出界将他拖到视图断开用户的手指。
你可能想是这样的:
- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
CGPoint translation = [recognizer translationInView:self.view];
// Figure out where the user is trying to drag the view.
CGPoint newCenter = CGPointMake(self.view.bounds.size.width / 2,
recognizer.view.center.y + translation.y);
// See if the new position is in bounds.
if (newCenter.y >= 160 && newCenter.y <= 300) {
recognizer.view.center = newCenter;
[recognizer setTranslation:CGPointZero inView:self.view];
}
}
有可能是罗布的回答的一个意想不到的后果。 如果拖动速度不够快newCenter会出界,但可能最后一次更新之前发生。 这会导致不摇一路到底的观点。 而不是不更新,如果newCenter是出界,你应该总是更新中心,但限制的范围,像这样:
- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
CGPoint translation = [recognizer translationInView:self.view];
// Figure out where the user is trying to drag the view.
CGPoint newCenter = CGPointMake(self.view.bounds.size.width / 2,
recognizer.view.center.y + translation.y);
// limit the bounds but always update the center
newCenter.y = MAX(160, newCenter.y);
newCenter.y = MIN(300, newCenter.y);
recognizer.view.center = newCenter;
[recognizer setTranslation:CGPointZero inView:self.view];
}
两个答案以上是正确的Y坐标。 这是谁正在寻找这两个X和Y坐标的人。 刚刚做了小改动。
- (void)panWasRecognized:(UIPanGestureRecognizer *)panner {
UIView *piece = [panner view];
CGPoint translation = [panner translationInView:[piece superview]];
CGPoint newCenter = CGPointMake(panner.view.center.x + translation.x,
panner.view.center.y + translation.y);
if (newCenter.y >= 0 && newCenter.y <= 300 && newCenter.x >= 0 && newCenter.x <=300)
{
panner.view.center = newCenter;
[panner setTranslation:CGPointZero inView:[piece superview]];
}
}