美文网首页
使用UIGestureRecognizer为控件添加触发事件

使用UIGestureRecognizer为控件添加触发事件

作者: CyrusCao | 来源:发表于2016-06-30 22:06 被阅读470次

UIGestureRecognizer 是一个抽象类,用来识别用户对控件的操作。同过创建它的不同子类的对象来识别不同的手势。如:

  • UITapGestureRecognizer 用来识别轻点手势
  • UISwipeGestureRecognizer 用来识别滑动手势
  • UILongPressGestureRecognizer 用来识别长按手势

使用

第一步,创建一个 UIGestureRecognizer

    let gestureRecognizer = UITapGestureRecognizer(target: self, 
        action: #selector(SomeViewController.someEvent(_:)))

以上代码创建了一个 UITapGestureRecognizer, 用来识别用户的轻点手势。初始化函数被传入两个参数,target 是该响应事件的接收者,通常是 ViewController;第二个是 action, 用来定义事件的执行内容。其中 #selector(SomeViewController.someEvent(_:)) 是在 Swift 中定义的新的 selector 声明方法,参数是通过类名定位到一个函数。

第二步,定义一个函数,用来响应事件

    func someEvent(sender: UITapGestureRecognizer) {
        // 事件
    }

sender 的类型要和 gestureRecognizer 的类型匹配 。现在只要探测到用户的轻点手势,就会执行 someEvent() 函数。

第三步,为指定控件添加 UIGestureRecognizer

    let someView = UIView()
    someView.addGestureRecognizer(gestureRecognizer)

一个简单的手势识别器就定义完成了。

添加委托

我们可以为 UIGestureRecognizer 添加委托,以实现对手势的监听、筛选甚至传递参数。

首先,将 UIGestureREcognizer 所在的 UIViewController 实现 UIGestureRecognizerDelegate 协议

    class SomeViewController: UIViewController, UIGestureRecognizerDelegate {

在 SomeViewController 类中实现 UIGestureRecognizerDelegate 协议的方法

UIGestureRecognizerDelegate 中有很多用来控制手势识别的方法,例如:

  • gestureRecognizerShouldBegin()
  • gestureRecognizer()

第一个方法返回一个布尔值,用来表示该手势识别是否应该被执行。第二个方法包含了许多同名重载方法,根据第二个参数的不同,具有不同的控制内容。我们可以根据需要来实现各种方法。如:

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
            return true
        }

该方法接收一个 UITouch 类型的参数,可以针对 UITouch 对象的属性进行判断,如位置、次数、力度等等。返回 True 表示可以接收触摸操作,反之则忽略触摸操作。

多视图手势识别

通常,我们的界面不仅仅是一两个控件这么简单的。我们通常需要借助于视图的继承关系来进行代码级的布局,所以这种层叠的视图关系在应用中是很常见的。如:

上图中蓝色的 UIView2 是红色的 UIView1 的子类,也就是说 uiView1.addSubview(uiView2) 。那么如果我们想要为 UIView2 添加手势识别的话, 就只有UIView2UIView1 的内部的部分才会被探测到。如:

只有图中绿色的交叉部分才会被探测到。iOS系统检测到手指触摸操作时会将其打包成一个 UIEvent 对象,并放入当前活动 Application 的事件队列,单例的UIApplication会从事件队列中取出触摸事件并传递给单例的 UIWindow 来处理,UIWindow 对象首先会使用hitTest:withEvent:方法寻找此次操作初始点所在的视图。该方法将由UIWindow 开始逐级向子视图遍历,直到有子视图返回非空对象或者全部遍历完毕,所以当判断到父视图的时候,并没有与触摸点契合,遍历所有的视图后仍然没有返回非空对象,所以并无任何响应。如果我们反过来,只为父视图 UIView1 添加手势识别器的话,那么点击绿色的交叉区域不会有任何效果。因为子视图视图在父视图的层级关系之上,用户点击的是 UIView2 而不是 UIView1。如果想要在点击交叉区域的时候触发 UIView1 的点击事件,则需要将子视图置于下方:uiView1.sendSubviewToBack(uiView2)

相关文章

网友评论

      本文标题:使用UIGestureRecognizer为控件添加触发事件

      本文链接:https://www.haomeiwen.com/subject/ezdfjttx.html