我有连接到我的iOS应用景色的UIPanGestureRecognizer。 我从复制的代码倒是示例应用程序的盘支架。 当手势开始,我的代码:
- 记录的原始定位点和中心。
更改锚点和中心能够围绕用户的手指,就像这样:
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;
}];
而且,做动画视图回到原来的起点。 然而,动画开始之前,该视图跳转到在用户界面中不同点。 IOW,放手,它跳跃的话,就以动画方式返回原来的位置。
我想也许我需要设置锚点中心动画之外,或许设置中心位置在超认为,当手势开始,但似乎没有什么区别等。
我缺少的是在这里吗? 如何防止跳时,使用者放开?
我怀疑不尝试,你在做什么,两个问题:
改变锚点的变化的图的/层的位置。 为了改变锚点没有位置的修改,你可以使用一些帮助像这样的:
-(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;
}
(我用我自己在我的项目在这里找到:。 改变我的CALayer的anchorPoint移动视图 )
动画设置锚点回到其原始值。 你应该使用上面的助手重置锚点。 这保证了改变锚视图时不会移动。 你必须做这个动画之外 。 然后,使用一个动画块更改视图的中心,它以动画,你希望它是。
文章来源: Why does my view jump when setting the layer anchorPoint in an animation block?