在CAKeyframeAnimation之后,UIButton不会接收到触摸

时间:2012-10-28 09:27:21

标签: ios uibutton core-animation cakeyframeanimation

我的情况: 我有一个UIButton,它是CAKeyframeAnimation的动画,在UIView上被声明为类别:

    CAKeyframeAnimation * scale =  [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
    scale.duration = duration;
    scale.beginTime = delay;
    scale.fillMode = kCAFillModeForwards;

    NSMutableArray * times = [[NSMutableArray alloc] init];

    scale.values = values;
    scale.timingFunctions = times;

    CAAnimationGroup * group = [CAAnimationGroup animation];
    [group setDelegate:self];
    [group setDuration:duration + delay];
    [group setFillMode:kCAFillModeForwards];
    [group setRemovedOnCompletion:NO];
    [group setAnimations:[NSArray arrayWithObject:scale]];

    [self.layer addAnimation:group forKey:@"scale"];

问题是在动画之后,按钮没有接收到触摸。如果我删除动画一切正常。 有谁知道我做错了什么?

由于

3 个答案:

答案 0 :(得分:4)

您不应该使用kCAFillModeForwards和removedOnCompletion = NO来将动画图层粘贴到最终位置。这不适用于控件,并导致您注意到的行为。

相反,在将动画添加到图层之前设置按钮的最终状态。

self.layer.transform = CGAffineTransformMakeScale(finalScaleX, finalScaleY);
[self.layer addAnimation:group forKey:@"scale"];

答案 1 :(得分:4)

问题是动画只会更改按钮的显示,但触摸目标仍然与之前相同。您应该在完成后删除动画并在按钮上设置变换或者测试表示层。

我写了hit testing animating layers in a blog post,更详细地解释了它。

答案 2 :(得分:2)

动画结束时,您必须插入以下代码行self.layer.transform = CGAffineTransformMakeScale(finalScaleX, finalScaleY);