为什么设置我的看法跳的时候层anchorPoint在动画块?(Why does my view ju

2019-09-17 01:03发布

我有连接到我的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,放手,它跳跃的话,就以动画方式返回原来的位置。

我想也许我需要设置锚点中心动画之外,或许设置中心位置在超认为,当手势开始,但似乎没有什么区别等。

我缺少的是在这里吗? 如何防止跳时,使用者放开?

Answer 1:

我怀疑不尝试,你在做什么,两个问题:

改变锚点的变化的图的/层的位置。 为了改变锚点没有位置的修改,你可以使用一些帮助像这样的:

-(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?