在UIViews图层动画化后,UIView上的UIPanGestureRecognizer表现得很奇怪

时间:2013-09-18 22:40:33

标签: ios objective-c uiview uigesturerecognizer caanimation

我有一系列UIViews,我沿弧线动画。每个视图上都有一个UIPanGestureRecognizer,它在任何动画发生之前按预期工作。

然而,在为视图设置动画后(使用下面的方法为视图的图层设置动画),手势无法正常工作;实际上,它看起来好像是在原来的屏幕位置上工作。

我尝试了各种各样的事情,包括将视图框架和/或边界与动画图层上的视图框架和/或边界相​​匹配,甚至删除现有的手势并再次创建和添加它们(下面未显示)。

如果有人知道发生了什么或者能让我解决这个问题,我们将不胜感激。

编辑: iMartin建议改变

pathAnimation.removedOnCompletion = NO;

pathAnimation.removedOnCompletion = YES;

view.layer.position = ... //

让我开始解决这个问题。

原始代码:

- (void)animateUIViewAlongArc:(UIView*)view clockwise:(BOOL)clockwise duration:(float)duration
{
    [UIView animateWithDuration:duration animations:^{

    CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimationanimationWithKeyPath:@"position"];
    pathAnimation.calculationMode = kCAAnimationPaced;
    pathAnimation.fillMode = kCAFillModeForwards;
    pathAnimation.removedOnCompletion = NO;
    pathAnimation.repeatCount = 1;

    CGPoint viewCenter = view.objectCenter;
    CGMutablePathRef arcPath = CGPathCreateMutable();
    CGPathMoveToPoint(arcPath, NULL, viewCenter.x, viewCenter.y);

    float angleOfRotation = self.angleIncrement;
    if (clockwise == NO)
    {
        angleOfRotation *= -1.0f;
    }

    float fullwayAngle = view.angle + angleOfRotation;
    CGPoint fullwayPoint = pointOnCircle(self.center, self.radius, fullwayAngle);

    CGPathAddRelativeArc(arcPath, NULL, self.center.x, self.center.y, self.radius, view.angle, angleOfRotation);
    pathAnimation.path = arcPath;
    CGPathRelease(arcPath);

    [view.layer addAnimation:pathAnimation forKey:@"arc"];

    view.angle = fullwayAngle;
    view.objectCenter = fullwayPoint;

    } completion:^(BOOL finished){
        if (finished)
        {
            CGRect frame = view.layer.frame;
            CGRect bounds = view.layer.bounds;

            view.frame = frame;
            view.bounds = bounds;
        }
    }];

}

1 个答案:

答案 0 :(得分:3)

您是否在动画后检查了视图/图层的框架?

我认为问题在于,你看到的是你得到什么图层本身并没有改变它的位置/框架,只是改变了它的presentationLayer表示层就是你在屏幕上看到的。如果你删除这一行,你可以看到这个:

pathAnimation.removedOnCompletion = NO; // Delete or set to YES

将此设置为NO会导致表示层位于屏幕上与您的视图不同的位置 您应该做的是在向其添加动画之前将最终位置设置到图层。

view.layer.position = finalPosition; // You should calculate this
[view.layer addAnimation:pathAnimation forKey:@"arc"];