IOS中添加事件响应

在IOS中添加事件响应主要有两种种方式,UIGestureRecognizer和UIControl。

当两种种响应事件同时存在的时候,UIControl的响应优先级高于UIGestureRecognizer。

这儿先讲一下事件响应原理:UIVIew继承自UIResponser,最终触摸事件是在TouchXX函数中实现,但是在这之前需要通过UIView中定义的HitTest函数来递归找到我们的HitTestView,HitTestView就是响应事件的那个View,关于寻找HitTestView只需要记住一句话:寻找hitTestView的顺序是从application的最上层开始,一直到最下面的子view(相当于树的叶子结点),即每找到一个view就将其添加到事件响应链,并且调用pointinside函数继续在他的子view中寻找,直到没有子view或者子view不包括点击区域;响应触摸事件是相反的方向,后者也称为响应链的方向(响应触摸事件在代码中表现为Touchxx函数的调用,如果需要同时响应需要在touchxx中继续调用他的super方法),如果最后找到的view能够响应事件那么它就是我们要找的hitTestView,如果不能就继续沿响应链向上,直到找到hitTestView,如果一直到application都没有,系统就抛弃该事件。

添加UIControl事件

UIControl应该是开发过程中使用最多的类了,各种控件都继承于它。通常有通过xib和手写代码添加两种方式,xib具体操作方法这儿不做介绍,请参阅其他文章。代码添加方式如下:

[self.backgroundBtn addTarget:self action:@selector(clickBtn) forControlEvents:UIControlEventTouchUpInside];

这儿想特别说明一下在UIControl中定义的beginTrackingWithTouch这几个函数中,其实做的事是定义了一些在触摸阶段的一些额外自定义效果事件,比如Button中会定义一些高光之类的效果。

添加UIGestureRecognizer事件

可以为任意的UIView通过的addGestureRecognizer方法添加一个或者多个手势(addGestureRecognizeer是在UIView的扩展(UIViewGestureRecognizer)中定义)。当添加多个手势的时候,可以在UIGestureRecognizer的delegate中定义是否同时响应UIGestureRecognizer的多种手势,这儿的同时响应是指UIGestureRecognizer内部的,不包括和UIControl类型的事件的同时响应,比如同时响应UIGestureRecognizer定义的touchGesture和panGesture。

    UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(OnCancleFilter:)];
    [_titleImageView addGestureRecognizer:gesture];
    
    -(void)OnCancleFilter:(id)sender
    {
        //to do
    }

有时候会遇到一些比较复杂的事件响应情况,如一个竖向scrollview的cell里又需要响应横向scrollview,这样cell中的滑动事件容易被外层的scrollview给消耗掉,这时候就需要对外层scrollview有一些特殊的设置来实现需要的功能,比如外面的scrollview延时响应。实践过程中会遇到不少类似问题,还是很需要耐心慢慢解决,坑总是一个一个躺过来的。

你可能感兴趣的:(IOS中添加事件响应)