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的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 中的状态恢复期间未调用 app delege didfinishlaunching