UIView之userInteractionEnabled属性介绍

属性作用

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

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

在一次动画执行流程中,动画包含的所有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 。

时间: 2024-10-12 21:26:37

UIView之userInteractionEnabled属性介绍的相关文章

关于UIView的userInteractionEnabled属性

如果父视图为ParentView包含一个Button,如果再ParentView上添加子视图ChildView,且ChildView盖住了 Button,那么Button就得到不响应了,为了让Button响应,可以设置ChildView的userInteractionEnabled = NO:最近被这个问题困扰了很久,开始想用事件传递的方法,重写类继承自UIView,最后被这简单属性搞定了.... 关于UIView的userInteractionEnabled属性,布布扣,bubuko.com

UIView的userInteractionEnabled属性的意义

如果父视图为ParentView包含一个Button,如果再ParentView上添加子视图ChildView,且ChildView盖住了Button,那么Button就得到不响应了,为了让Button响应,可以设置ChildView的userInteractionEnabled = NO

iOS bug 日志-userInteractionEnabled

今天做一个九宫格密码的项目,设button的selected状态,怎么都不对,后来发现这个属性的作用 [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal]; btn.userInteractionEnabled = NO; //设置选中的图片 [btn setBackgroundImage:[UIImage imageNamed:@"

IOS的UI总结

一.UIView常见属性 1.frame  位置和尺寸(以父控件的左上角为原点(0,0)) 2.center 中点(以父控件的左上角为原点(0,0)) 3.bounds  位置和尺寸(以自己的左上角为原点(0,0)) 4.transform  形变属性(缩放.旋转) 5.backgroundColor 背景颜色 6.tag  标识(父控件可以根据这个标识找到对应的子控件,同一个父控件中的子控件tag不要一样) 7.hidden 设置是否要隐藏 8.alpha  透明度(0~1) 9.opaque

IOS总结:UIScrollView不能滚动的几种可能性

UIScrollView不能滚动,请检查以下几点,当然还有更多,需要在不断的开发经验中总结: 1. 没有设置contentSize. 2. scrollEnabled =NO 了. 3. 没有收到触摸事件,因为UIScrollView继承自UIView,如果让UIView的 UserInteractionEnabled如果为NO,说明不可与用户交互,也是不可滚动的. 4. 没有取消autolayout功能. 其他的以后再添加吧,如果您有总结,可以写在下面,谢谢!...

UIButton的一些技巧

1.预置按钮类型 sdk提供了5个预置按钮类型:Detail Disclosure,Info Light,Info Dark,Contact Add,Rounded Rectangle.它们添加到sdk中首先是为了方便苹果公司自己. 构造方式:[UIButton buttonWithType:UIButtonTypeContactAdd]; 2.显示系统私有UIButton风格 指定 值为100 以上的UIButton的buttonWithType可以得到非公开的按钮风格,像红色按钮,黑色按钮,

clipToBounds

最近在开发H5平台的iOS移动侧,遇到些问题,随手记录下来. 1 UIView的clipToBounds 窗口裁剪,默认是NO,表示如果父窗口的大小已经不足以显示子窗口,也不进行裁剪,而是显示,但这时给测试人员造成了困扰,看着控件显示出来了,就是点击动作无法触发.SO,统一设置为YES. 2 UIView的userInteractionEnabled 用户动作穿透点击. 对于不同的View子对象,默认值是不同的 UIView 默认为YES,表示允许点击穿透. UIImageView 默认为NO,

IOS - UIView添加点击事件

UIView通过手势(Gesture-UITapGestureRecognizer)添加点击事件, 类似于UIButton的效果. 示例: UIImageView *iKnowIcon = [CYResource loadImageView:@"free-question-once-more-i-know.png"]; iKnowIcon.top = questionIcon.top + scaleWidthWith320(200); iKnowIcon.centerX = self.

Objective - C学习笔记:UIView的使用方法

1.1 - (void)layoutSubviews; * 当一个控件的frame发生改变的时候就会自动调用 * 一般在这里布局内部的子控件(设置子控件的frame) * 一定要调用super的layoutSubviews方法 1.2 - (void)didMoveToSuperview; * 当一个控件被添加到父控件中就会调用 1.3 - (void)willMoveToSuperview:(UIView *)newSuperview; * 当一个控件即将被添加到父控件中会调用 @interf