美文网首页程序员iOS DeveloperiOS
十分钟了解响应者链条(代码:swift)

十分钟了解响应者链条(代码:swift)

作者: 鹿丸眼中的云 | 来源:发表于2016-03-13 23:49 被阅读334次

响应者链条

事件的响应

用户点击屏幕产生的一个触摸事件,经过一系列的传递过程后,会找到一个最适合的视图来处理事件.找到最合适的视图控件后,就会调用控件的touches方法来作具体的时间处理.touches的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者处理

  • 什么是响应者链条?

由多个响应者对象连接起来的链条

  • 什么是响应者对象?

继承了UIResponder的对象

  • 系统是如何寻找最合适的View

1.先判断自己是否能接收触摸事件

2.再判断触摸的当前点在不在自己身上

3.如果在自己身上,它会从后往前遍历子控件,遍历出每一个控件后,重启前两步

4.如果没有符合条件的子控件,那么自身就是最合适的View

在寻找最合适View的过程中,系统会调用2个方法

  • hitTest
  • pointInside

在开发中或多或少会需要一些特殊的点击,例如:

  • 一个按钮被一个半透明的View部分遮挡,需要点击到按钮的时候,按钮始终响应

  • 一个View超出了父视图的范围,需要点击超出范围的View也有响应

当一个控件不能接收时间时一般有以下几种情况

1.不接收用户交互userInteractionEnabled = NO

2.当一个控件隐藏时Hidden = YES

3.当一个控件为透明白时

4.触摸时间的传递是从父控件传递到子控件的,如果一个父控件不能接收事件,那么他里面的子控件也不能接收.

一次完整的触摸事件的传递响应的过程

  • UIAppliction --> UIWiondw -->递归找到最适合处理事件的控件-->控件调用touches方法-->判断是否实现touches方法-->没有实现默认会将事件传递给上一个响应者-->找到上一个响应者

代码演示之按钮被一个半透明的View部分遮挡,需要点击到按钮的时候,按钮始终响应

  • 效果
响应者链条测试.gif
  • storyBoard处理
storyBoard
  • ViewController
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

       
    }
    
    @IBAction func clickButton(sender: AnyObject) {
        
        print("按钮被点击了")
    }
   
  }
  • WHTestView(即半透明view)代码

import UIKit

class WHTestView: UIView {

 @IBOutlet weak var button: UIButton!
   
    override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
        let BtnPiont = convertPoint(point, toView: button)
        
        if button.pointInside(BtnPiont, withEvent: event){
        
            return false
        }
        return super.pointInside(point, withEvent: event)
    }   
}
  • 注意:WHTestView中的button要反向拖线

相关文章

  • 十分钟了解响应者链条(代码:swift)

    响应者链条 事件的响应 用户点击屏幕产生的一个触摸事件,经过一系列的传递过程后,会找到一个最适合的视图来处理事件....

  • 浅析iOS中事件的产生与响应过程

    想要学习事件的产生与响应过程首先要了解什么是响应者对象,什么是响应者链条。 响应者对象:继承了UIResponde...

  • [需求记录]_使用hitTest实现穿透点击事件

    参考链接:一篇搞定事件传递、响应者链条、hitTest和pointInside的使用 效果演示: 代码如下:

  • 响应者链

    1> 什么是响应者链 响应者链条是由多个响应者对象连接起来的链条,其中响应者对象是能处理事件的对象,所有的View...

  • 什么是响应者链

    响应者链条是由多个响应者对象连接起来的链条,其中响应者对象是能处理事件的对象,所有的View和ViewContro...

  • 响应者链条

    1.什么是事件响应链2.touch 事件分发3.hit-test 底层实现4.应用 1.什么是事件响应链 大多数事...

  • 响应者链条

    什么是事件? iOS中事件分为3大类 : 触摸事件, 加速计事件和远程控制事件.当你的手指在手机屏幕上触摸时, 产...

  • 响应者链条

    响应者链条:是由多个响应者对象连接起来的链条 作用:能很清楚的看见每个响应者之间的联系,并且可以让一个事件多个对象...

  • 响应者链条

    ** 响应者链条** 在iOS中不是任何对象都能处理时间,只有继承了UIResponder的对象才能接收并处理事件...

  • 响应者链条

网友评论

    本文标题:十分钟了解响应者链条(代码:swift)

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