Responder

当我们在iPhone、iPad 等iOS 装置上,用手指按到一个按钮上的时候,事实上,我们并不是真的按在一个按钮上,而是按在屏幕上—是触控屏幕的硬件接收了我们的输入之后,再将我们的触控输入送到软件中,最后营造了「我们的手指按到了按钮上」的幻觉。

从工程师的角度来看,所谓的UI 都只是幻觉,「手指按到了屏幕中的按钮」这件事情本身并不存在。而制作UI,就是在制造幻觉;UI 设计,就是你打算营造怎样的幻觉。iOS 7 之前,苹果是透过渐层与逼真细腻但静态的图示制造光影的幻觉,在iOS 7 之后,图示变成扁平化设计,但是改用motion effect 等动画效果,创造深度的错觉。

不同于其他的开发平台,在iOS 与Mac OS X 上,事件(Event)只用来表达来自硬件的各种输入行为。在iOS 上的UIEvent 包含了触控输入、蓝芽耳机遥控换歌等,Mac OS X 上的NSEvent 则包括了键盘、滑鼠事件。

事件的传递

在iOS 装置上,当硬件发生触控事件,到我们的按钮发生反应之间,事实上经历了:

  • 硬件把事件传到我们的App 中,交由UIApplication 实例分派事件
  • UIApplication 把事件传送到Key Window 中,接着由Key Window 负责分派事件
  • Key Window 开始寻找在View Heirarchy 中最上层的view controller 与view,然后,发现最上层的view 是我们的按钮
  • 触发按钮的target/action

事件从application 传递到window,从window 传递到对应的view 之上的流程,如果我们反过来看,就会变成「谁最后应该负责处理事件」—如果有个view 该处理,就会是view 处理,不然就会fallback 到window,window 不处理又会fallback 到application 上。

从application 到window 到view,每一层中可以处理事件的物件,都叫做responder,要实现NSResponder 或UIResponder protocol。回到我们会给一个专有名词的习惯,所谓responder,就是「可以处理事件的实例」。

在一堆可以处理事件的实例中,最后被分派到、把事件处理掉的实例,叫做first responder,而这种一环又一环寻找谁该处理事件的锁链,叫做Responder Chain。

而这个流程,会在runloop 当中不断循环。

results matching ""

    No results matching ""