[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事件。