1

我有一个 UILabel,我添加了一个 GestureRecognizer。我可以在屏幕上很好地拖动它,但我想要做的是当标签在一个区域内时,我希望它停止拖动并让它平滑地移动到该区域内的指定点。

因此,如果它的 x 值大于 150,则将其移至 200 的 x 和 150 的 y

它确实有效,但它弹出到该位置,而不是顺利移动到该位置。

这是我的拖动方法:

- (void)labelDragged:(UIPanGestureRecognizer *)gesture {
UILabel *label = (UILabel *)gesture.view;
CGPoint translation = [gesture translationInView:label];

// move label
label.center = CGPointMake(label.center.x + translation.x,
                           label.center.y + translation.y);

[gesture setTranslation:CGPointZero inView:label];

if (label.center.x > 150){

    [label setUserInteractionEnabled:NO];

    [UIView animateWithDuration:1.5 animations:^{
        label.center = CGPointMake(200 , 150);
    }];
}

}

任何帮助,将不胜感激。我是使用动画和点的新手。

4

2 回答 2

2

您必须等到 panGesture 状态。因此需要条件。使用平移手势时,您从标签中删除了 userInteraction。通过删除用户交互,它不会从 UILabel 中删除手势,这就是发生这种情况的原因。要在 UILabel 上工作动画,您必须离开 UILabel拖动后。从标签上移除手指,它会动画。使用下面的代码。

- (void)labelDragged:(UIPanGestureRecognizer *)gesture {
    UILabel *label = (UILabel *)gesture.view;
    CGPoint translation = [gesture translationInView:label];

    // move label
    label.center = CGPointMake(label.center.x + translation.x,
                               label.center.y + translation.y);
    [gesture setTranslation:CGPointZero inView:label];

    if (label.center.x > 150){
        [label setUserInteractionEnabled:NO];
        if(gesture.state == UIGestureRecognizerStateEnded)
        {
            CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
            [animation setFromValue:[NSValue valueWithCGPoint:label.center]];
            [animation setToValue:[NSValue valueWithCGPoint:CGPointMake(200.0f, 400.0f)]];
            [animation setDuration:2.0f];

            [label.layer setPosition:CGPointMake(200.0f, 400.0f)];
            [label.layer addAnimation:animation forKey:@"position"];
        }
    }
}
于 2013-06-07T05:49:22.103 回答
0

如果您确实想在 UIPanGestureRecognizer 仍在执行时取消它,您可以这样做。将 enabled 属性设置为 NO,并在动画完成后重新启用它。

if (label.center.x > 150){
    gesture.enabled = NO;
    [label setUserInteractionEnabled:NO];

    [UIView animateWithDuration:1.5 animations:^{
        label.center = CGPointMake(200 , 150);
    } completion:^(BOOL finished) {
        gesture.enabled = YES;
    }];
}

但是一旦标签被捕捉,您将无法拖动它,因为由于标签的位置,手势将始终被禁用。最好在手势结束时捕捉标签。

if (gesture.state == UIGestureRecognizerStateEnded) {
    //check the position and snap the label        
}
于 2013-06-07T05:53:00.487 回答