我的iOS应用中的视图附加了UIPanGestureRecognizer。我从Touches sample app复制了代码处理程序的代码。手势开始时,我的代码:
将锚点和中心更改为围绕用户的手指,如下所示:
CGPoint locationInView = [gestureRecognizer locationInView:target];
CGPoint locationInSuperview = [gestureRecognizer locationInView:target.superview];
target.layer.anchorPoint = CGPointMake(
locationInView.x / target.bounds.size.width,
locationInView.y / target.bounds.size.height
);
target.center = locationInSuperview;
随着手势的进行,平移处理器不断改变中心以跟踪手指的移动。到目前为止一切都很好。
当用户放手时,我希望视图动画回原始起点。执行此操作的代码如下所示:
[UIView animateWithDuration:2 delay:0 options:UIViewAnimationCurveEaseOut animations:^{
target.center = originalCenter;
target.layer.anchorPoint = originalAnchorPoint;
}];
这确实将视图设置为原始起点。但是,在动画开始之前,视图会跳转到UI中的其他位置。 IOW,放开,它跳跃,然后它动画回到它所属的位置。
我想也许我需要设置锚点并在动画外部居中,也许将中心设置为超级视图中的位置,就像手势开始时一样,但这似乎没什么区别。
我在这里缺少什么?当用户放手时,如何防止跳转?
答案 0 :(得分:10)
我怀疑有两个问题没有尝试你正在做的事情:
更改定位点会改变视图/图层的位置。为了在不修改位置的情况下更改定位点,您可以使用这样的一个帮助程序:
-(void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view
{
CGPoint newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x, view.bounds.size.height * anchorPoint.y);
CGPoint oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x, view.bounds.size.height * view.layer.anchorPoint.y);
newPoint = CGPointApplyAffineTransform(newPoint, view.transform);
oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform);
CGPoint position = view.layer.position;
position.x -= oldPoint.x;
position.x += newPoint.x;
position.y -= oldPoint.y;
position.y += newPoint.y;
view.layer.position = position;
view.layer.anchorPoint = anchorPoint;
}
(我在我的项目中自己使用它。发现在这里:Changing my CALayer's anchorPoint moves the view)
您的动画会将定位点设置回原始值。 您应该使用上面的帮助程序来重置锚点。这可确保在更改锚点时视图不会移动。您必须在动画之外执行此操作。然后,使用动画块更改视图的中心并将其设置为您想要的位置。