在动画制作动画时更新视图的帧

时间:2016-06-14 17:23:29

标签: ios uiview core-animation caanimation cakeyframeanimation

我正在做这样的动画:

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    animation.duration = 100.0;
    animation.path = self.animationPath.CGPath;
    [view.layer addAnimation:animation forKey:@"animation"];

工作正常,但是,当尝试检测在屏幕上移动的对象上的触摸时,这现在失败了:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    for (UIView* subview in self.subviews ) {
        if ( [subview hitTest:[self convertPoint:point toView:subview] withEvent:event] != nil ) {
            [self handleTap];
            return YES;
        }
    }
    return NO;
}

它失败了,因为视图的帧不再与它在动画时在屏幕上的明显位置相同。如何让pointInside使用正在设置动画的视图?

2 个答案:

答案 0 :(得分:3)

这是我执行此操作的代码

2

我希望这有助于你

答案 1 :(得分:2)

简短的回答:你做不到。在UIView和核心动画动画中,视图/图层实际上不会移动,因为它的位置似乎是动画。相反,有一个“表示层”在动画对象移动时绘制它。

如果你想在位置动画“飞行中”时使对象可以进行点击,你必须在超视图上放置一个轻击手势识别器,该超视图跨越视图将遍历的整个区域,然后在表示层上进行命中测试正在设置动画的对象。

编辑:

我在Github上有一个名为iOS CAAnimation Group demo的项目,该项目展示了如何在表示层上使用命中测试来检测在复杂路径上进行动画处理的视图上的点击。

代码是用Objective-C编写的,但它仍然应该是概念和技术的例证。如果您无法理解Objective-C代码,请告诉我。我在Swift方面很体面,虽然我仍然主要以Objective-C支付账单,所以这就是我最熟悉的语法。