6

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

提前致谢

4

4 回答 4

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];
    }
}
于 2012-07-11T20:36:39.470 回答
14

Rob 的回答可能会产生意想不到的后果。如果拖得足够快, 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];
}
于 2015-01-08T22:32:40.963 回答
1

以上两个答案对于 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]];
    }
}
于 2017-07-20T08:47:10.927 回答
0
-(void)handlePan:(UIPanGestureRecognizer*)pgr;
{
    if (pgr.state == UIGestureRecognizerStateChanged) {
        CGPoint center = pgr.view.center;
        CGPoint translation = [pgr translationInView:pgr.view];
        center = CGPointMake(center.x + translation.x,
                             center.y + translation.y);

        if ([self pointInside:center withEvent:nil])
        {
            pgr.view.center = center;
            [pgr setTranslation:CGPointZero inView:pgr.view];
        }
    }
}
于 2019-08-22T00:21:51.410 回答