iOS:动画期间未调用IBAction



在我的应用程序中,我调用此方法来移动UIButton

- (void) buttonMovement{
[UIView animateWithDuration:0.8
delay:0.0
options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut
animations:^{
// do whatever animation you want, e.g.,
play_bt.center = CGPointMake(play_bt.center.x, play_bt.center.y-20);
}
completion:NULL];
}

通过这种方式,我的按钮做了一个"向上和向下"的移动,但如果我"按下"它,IBAction就不起作用了。如果我不做这个动画,效果很好。为什么?如果这个动画是一个问题,那么如何制作一个不会给我带来问题的动画呢?另一种方法是将按钮移动为图像视图,然后我放了一个不可见的按钮,但我失去了按下效果,它变成了噪音。

很多人在这里提供了错误的信息。我试着发表评论。现在是时候发布一个结论性的答案了。引用我对@Radu链接的">点击动画图像/按钮"问题的回答:

简单的答案是,在视图设置动画时,不能轻击视图。原因是这些视图实际上并没有从开始位置传播到结束位置。相反,系统在核心动画中使用"表示层"来创建视图对象移动/旋转/缩放/其他的外观。

你要做的是将一个敲击手势识别器连接到一个完全包围动画(可能是整个屏幕)的包含视图,然后编写代码来查看敲击的坐标,进行坐标转换,并决定敲击是否在你关心的视图上。如果点击是在一个按钮上,并且你想让按钮高亮显示,你也需要处理这个逻辑。

我在github上有一个示例项目,展示了如何在使用CABasicAnimation(为层而非视图设置动画)同时进行UIView动画和Core动画时做到这一点。)

核心动画演示及命中测试

解决方法是为动画按钮实现touchesBegan而不是IBAction。

你可能想检查这里给出的答案:点击动画图像/按钮

- (void)touchesBegan:(NSSet*) touches withEvent:(UIEvent *) event{
// Get location of touched point
CGPoint point = [[touches anyObject] locationInView:self.view];
//
// Check if point is inside your button frame
// or compare it with the presentation layer
//
}

最新更新