UIPanGestureRecognizer限制坐标

Phi*_*lip 6 objective-c uiview uipangesturerecognizer

我在主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
    }
}
Run Code Online (Sandbox Code Playgroud)

但现在我不知道如何将阻力限制在那些坐标上.

它不是一个巨大的视图,它只是一个包含工具栏和按钮的小视图.

如何将拖动限制为坐标?(x = 160(中间屏幕),y = 404)< - 示例

中心应该在那里?

我google了很多,但我找不到具体的答案.

提前致谢

rob*_*off 22

首先,您需要在更改视图中心之前强制执行限制.在检查新中心是否超出范围之前,您的代码会更改视图的中心.

其次,您需要使用正确的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];
    }
}
Run Code Online (Sandbox Code Playgroud)


Ore*_*ren 13

罗布的回答可能是一个意想不到的后果.如果拖得足够快,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];
}
Run Code Online (Sandbox Code Playgroud)