iOS 动画中正确响应button事件

[UIView animateWithDuration:1.4 animations:^{
             sender.center = CGPointMake(sender.center.x, sender.center.y+3);
 } completion:^(BOOL finished) {
              NSLog (@"动画结束了");
}];

在这个简单的动画开始后,单击屏幕上的btnTest并不能触发相应事件,因为btnTest的frame在动画结束位置,而并不在动画中的位置。所以只有单击动画结束位置才能响应其事件。如何能做到在动画中单击屏幕上的button能正确响应其事件呢?大致有两种办法。
1、第一种是使用NSTimer替代上面的动画。在此不多做介绍。
2、首先我们需要知道的是控件在动画中展示在屏幕中的是layer.presentationLayer,我们也可以称之为展示层,可以根据它得到当前动画中的坐标:layer.presentationLayer.frame。

那么我们就可以通过屏幕的触摸方法得到触摸点的坐标与上面动画中的坐标进行判断

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
        NSSet *allTouches = [event allTouches];    //返回与当前接收者有关的所有的触摸对象
        UITouch *touch = [allTouches anyObject];   //视图中的所有对象
        CGPoint point = [touch locationInView:self];//触摸点的坐标

        CGRect frame = [btn.layer presentationLayer].frame;//移动中的坐标
        
        if (CGRectContainsPoint(frame, point))
        {
            [self click:btn];
        }
}

ps:btn.userInteractionEnabled = NO; button的交互必须关掉,是事件能够向下传递被view接受,从而响应touch事件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,613评论 6 30
  • 好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是...
    Lotheve阅读 58,589评论 51 604
  • 在iOS开发中经常会涉及到触摸事件。本想自己总结一下,但是遇到了这篇文章,感觉总结的已经很到位,特此转载。作者:L...
    WQ_UESTC阅读 6,179评论 4 26
  • 转载:http://www.jianshu.com/p/32fcadd12108 每个UIView有一个伙伴称为l...
    F麦子阅读 6,403评论 0 13
  • 7、不使用IB是,下面这样做有什么问题? 6、请说说Layer和View的关系,以及你是如何使用它们的。 1.首先...
    AlanGe阅读 751评论 0 1