属性作用

该属性值为布尔类型,如属性本身的名称所释,该属性决定UIView是否接受并响应用户的交互。

当值设置为NO后,UIView会忽略那些原本应该发生在其自身的诸如touch和keyboard等用户事件,并将这些事件从消息队列中移除出去。当值设置为YES后,这些用户事件会正常的派发至UIView本身(前提事件确实发生在该view上),UIView会按照之前注册的事件处理方法来响应这些事件。

当视图对象的userInteractionEnabled设置为NO的时候,用户触发的事件,如触摸,键盘等,将会被该视图忽略(其他视图照常响应),并且该视图对象也会从事件响应队列中被移除。 当userInteractionEnabled设为YES时,则事件可以正常的传递给该视图对象。 userInteractionEnabled的属性默认值就是YES。

ps:响应者链是能够响应事件的对象组成的链,事件在该链上传递,最终结果事件或被处理或被抛弃。所以一个对象在不在响应者链里是其能否响应事件的首要前提条件!

在一次动画执行流程中,动画包含的所有UIView都会被临时禁止用户交互,而不管每个UIView本身userInteractionEnabled此时的属性值是YES还是NO。但是在配置动画时,通过添加UIViewAnimationOptionAllowUserInteraction选项可以禁止这种行为的发生,使UIView即使是在执行动画期间依然能响应用户事件。

发挥作用的简单原理描述

熟悉IOS消息响应链的开发者都了解Hit-Testing的基本过程,此处对此不做深究,我们可以简单的理解为在一次用户的touch交互中,是hit-test决定了Application的整个view层次结构中,到底该由哪个view去接收并处理该事件。其基本的筛选过程可以粗糙的叙述为:

  1. touch事件发生,创建UIEvent对象
  2. 按照Application的view层次结构,逐层调用每个view的hitTest:withEvent:方法,并传入该event对象,view根据hitTest:withEvent:方法和来决定touch点是否包含在自己的bounds中;
  3. 如果view的bounds包含了touch点,该view会遍历自己的subview,并调用每个subview的pointInside:withEvent:方法来进一步决定touch事件是发生在自己本身,还是自己的subview上。
  4. 重复第二,三步,并筛选出最终接受touch事件的view对象

我们关注的是筛选过程的第3步,view调用hitTest:withEvent:方法时,会受userInteractionEnabled属性设置的影响,如果当view的该属性值设置为NO时,即使最终touch点确实包含在view的bounds中,该view也会忽略touch事件,当然userInteractionEnabled的设置只是touch筛选的条件之一,在真正的筛选过程中还包含了其他因素的考虑,因此还要参考hitTest:withEvent:的具体方法描述,但以上描述个人感觉足够我们理解userInteractionEnabled属性的基本原理。

特殊子类的覆盖

userInteractionEnabled属性默认值为YES,但UIView的一些子类中对该属性进行了覆盖,并将其默认值设置为了NO,其中UIImageView和UILabel就是这样的类。userInteractionEnabled属性在UIImageView和UILabel的文档中都有简单的描述。在实际的界面开发过程中,我们经常用UIImageView来模拟按钮或其它可以响应用户touch事件的显示区,并通过gesture来为其添加事件响应,因此为了保证事件能正常的接受,我们必须要显示的将UIImageView对象的userInteractionEnabled的值设为YES 。

最新文章

  1. jdbc读取数据库,表相关信息(含注释)
  2. C#进阶系列——MEF实现设计上的“松耦合”(终结篇:面向接口编程)
  3. WP8 MediaElement 实现循环播放
  4. php解析一个url
  5. linux上挂载windows共享文件夹
  6. 【python】获取高德地图省市区县列表
  7. Verilog中的specify block和timing check
  8. css读书笔记1:HTML标记和文档结构
  9. 原生JS修改标签样式为带阴影效果
  10. Android 开发笔记 “弹出框”
  11. 编程基础——C/C++,Java,ObjC讨论回调模式
  12. [Oracle]LogMiner工具小结
  13. Swagger
  14. 一个 戴尔 dell 笔记本 bios Preparing to begin setup 问题
  15. Android 手机连不上电脑
  16. 洛谷P1762 杨辉三角,规律
  17. html复习小结
  18. @RequestBody
  19. UNITY3d在移动设备上的一些优化实战
  20. 洛谷P2387 [NOI2014]魔法森林(LCT)

热门文章

  1. WebGL学习笔记四点一
  2. PythonWeb 服务部署文档及迁移到Linux相关
  3. JavaWeb:HttpSession(一)
  4. angularJS1笔记-(19)-angular异步加载包的方式
  5. 51单片机数组的定义方法(code与data的作用)
  6. TiDB注意事项
  7. 红帽旗下Linux的版本说明RedHat、CentOS、Fedora、OEL等
  8. Oracle 数据库备份启用压缩以及remap
  9. todomvc-app
  10. Mxnet Windows配置