ios实用开发技巧程序员

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

2017-12-16  本文已影响34人  cfxiaoxixi

         今天心血来潮突然想实现一个弹幕控件,感觉很高大上,是不是。

        其实弹幕控件的实现,主题逻辑很简单,一个主视图,视图右侧随机放置一些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 = [touch  locationInView: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

            }

        }

    }

}

        这就能捕获到触摸的label,贴上项目地址(https://github.com/chenfengxiaoxixi/Barrage.git),有兴趣的可以下载来看看。

上一篇 下一篇

猜你喜欢

热点阅读