ios|ios 弹幕效果实现过程中,获取弹幕的点击事件

今天心血来潮突然想实现一个弹幕控件,感觉很高大上,是不是。
其实弹幕控件的实现,主题逻辑很简单,一个主视图,视图右侧随机放置一些label,然后通过平移动画,把label从右边移动到左边去,label从屏幕消失后,移除并且销毁。
今早尝试了下,很快就把主体功能实现了,后来感觉还可以给弹幕实现点击事件,然后又把点击事件添加上去了。这时,问题就来了,label在移动过程中,一直无法响应点击,userInteractionEnabled也设置为yes了,尝试了很久,添加到label上的手势,就是一直无法触发。后来查找了一些资料,发现是UIView animate的问题,label在执行动画时,与两个图层相关:
1、label.layer.presentationLayer用来显示动画(属性随动画过程慢慢改变);
2、label.layer用来处理用户交互(动画一开始属性值已经改变到动画结束时的状态)。
这就是为什么label平移时,上面添加的点击手势无法触发的原因。
解决办法,我是通过touchesBegan来解决点击的,从父视图上获取到触摸点,然后遍历找出触摸到的平移控件,下面贴一段代码:
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event
{
UITouch * touch = touches.anyObject; //获取触摸对象
CGPoint point = [touchlocationInView:self];
NSArray *subViews = self.subviews;
for(UIView *subView in subViews){
if([subView isKindOfClass:[UILabel class]]){ //是要找的label
CALayer *layer = subView.layer.presentationLayer; //显示层
if(CGRectContainsPoint(layer.frame, point)){ //触摸点在显示层中,返回label
}
}
}
}
【ios|ios 弹幕效果实现过程中,获取弹幕的点击事件】这就能捕获到触摸的label,贴上项目地址(https://github.com/chenfengxiaoxixi/Barrage.git),有兴趣的可以下载来看看。

    推荐阅读