UIView之userInteractionEnableed

该属性为BOOL类型,决定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 。

推荐阅读更多精彩内容

  • 在iOS开发中经常会涉及到触摸事件。本想自己总结一下,但是遇到了这篇文章,感觉总结的已经很到位,特此转载。作者:L...
    WQ_UESTC阅读 3,769评论 2 16
  • 好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是...
    Lotheve阅读 37,581评论 50 503
  • 属性作用 该属性值为布尔类型,如属性本身的名称所释,该属性决定UIView是否接受并响应用户的交互。 当值设置为N...
    Kevin追梦先生阅读 434评论 0 0
  • 2017年10月31日星期二晴 夏天不知不觉地过去了,秋姑娘就忙着给树木披上秋装。路过了田野,庄稼们都成熟...
    卢慧宁阅读 66评论 0 0
  • 我是一名老警察,平时喜欢徒步、跑步、爬山、穿越、旅游、摄影及写作,偶尔还有小作见诸报端。每当去各地参加完国际马拉松...
    鲤跃龙门阅读 258评论 2 0