UIPanGestureRecognizer限制坐标(UIPanGestureRecognizer

2019-07-30 08:59发布

我加入到我的主要的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搜索了很多,但我没有找到一个具体的答案。

提前致谢

Answer 1:

首先,您需要更改视图的中心之前,执行限制。 您的代码更改视图的检查,如果这个新的中心是出界前中心。

其次,你需要使用正确的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];
    }
}


Answer 2:

有可能是罗布的回答的一个意想不到的后果。 如果拖动速度不够快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];
}


Answer 3:

两个答案以上是正确的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]];
    }
}


文章来源: UIPanGestureRecognizer limit to coordinates