iOS:动画期间未调用 IBAction

Posted

技术标签:

【中文标题】iOS:动画期间未调用 IBAction【英文标题】:iOS: IBAction not called during animation 【发布时间】:2014-02-28 15:09:52 【问题描述】:

在我的应用程序中,我调用此方法来移动 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 将不起作用。如果我不做这个动画,它工作得很好。为什么? 如果这个动画是调用动作的问题,那么做一个不会给我带来问题的动画的方法是什么? 另一种方法是将按钮作为图像视图移动,然后我放置了一个不可见的按钮,但我失去了按下效果,它变成了所有噪音。

【问题讨论】:

线程的标题是“动画期间未调用IBAction”,但是你粘贴了一个void方法? 我写的是我的动画方法,它不是util show the IBAction,它没有被调用... @nazz_areno 我认为这会有所帮助:***.com/questions/20446966/…。使用 touches 开始而不是 IBAction。 你的帖子一点都不清楚。 IBAction 方法在哪里? (您发布的代码是 void 方法,而不是 IBAction。)您是说在动画期间“飞行中”时无法单击按钮吗?还是说动画完成后不能点击? 您不能在按钮在屏幕上移动时单击它们。可以检测动画对象上的点击,但它需要特殊代码来检查动画对象的表示层,以及 CALayer hitTest 方法。在动画完成之前,按钮 IBActions 永远不会对对象中心的“飞行中”动画起作用。 【参考方案1】:

很多人在这里提供了错误的信息。我试着用 cmets 称重。现在是发布结论性答案的时候了。引用我对上面@Radu 链接的“clicking an animating image/button”问题的回答:

简短的回答是,您不能在动画制作时点击视图。原因是视图实际上并没有从开始位置移动到结束位置。相反,系统使用 Core Animation 中的“表示层”来创建视图对象移动/旋转/缩放/其他的外观。

您要做的是将点击手势识别器附加到完全包围动画(可能是整个屏幕)的包含视图,然后编写查看点击坐标的代码,进行坐标转换,并确定是否点击您关心的视图。如果点击一个按钮并且您希望该按钮突出显示,您也需要处理该逻辑。

我在 github 上有一个示例项目,它展示了当您使用 CABasicAnimation(它为图层而不是视图设置动画)同时执行 UIView 动画和核心动画时如何执行此操作。

Core Animation demo with hit testing

【讨论】:

是的,@Radu 链接终于解决了我的问题,也感谢您提供的示例【参考方案2】:

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

您可能想查看这里给出的答案:Clicking an animating image / button

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


【讨论】:

以上是关于iOS:动画期间未调用 IBAction的主要内容,如果未能解决你的问题,请参考以下文章

动画期间未调用 UIButton 的选择器方法

在 iOS 中的状态恢复期间未调用 app delege didfinishlaunching

自定义 inputView 在模态演示期间未正确设置动画

核心动画 - 未调用 animationDidStop

如何在 iOS 7 和 iOS 6 中出现动画启动画面期间隐藏状态栏?

在 CABasicAnimation 期间 UIButton 未显示选定状态