我有一个UILabel,我已经添加了一个GestureRecognizer。我可以在屏幕上拖动它,但我想要做的是当标签位于我希望它停止拖动的区域内并使其平滑移动到该区域内的指定点时。
因此,如果它的x值大于150,则将其移动到x为200,y为150
它确实有效,但它会弹出到位置而不是平稳地移动到该位置。
这是我的拖拽方法:
- (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);
}];
}
}
任何帮助将不胜感激。我不熟悉动画和积分。
答案 0 :(得分: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"];
}
}
}
答案 1 :(得分: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
}