美文网首页
使用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