响应者链和 UILabel的userInteractionEnabled属性

原创 2015年11月19日 19:25:47
先来解释一下响应者链: 
响应者的定义为: iOS上所有能够产生响应事件的对象都是响应者.
响应事件具体分为: 触摸,  晃动,  远程事件
响应者链就是多个响应者的集合, 这些响应者是父子视图的关系.
所有响应者都有一个共同的父类, 叫做: UIResponder

以触摸为例, 响应者链对触摸事件的处理步骤如下: 

1. 系统检测到触摸操作, 将消息发送给UIApplication, 开始检测.

2. UIApplication查看发生触摸操作的位置是否还有子视图, 有得话, 继续查找子视图在该位置是否还有子视图, 依次向下, 直到找到最后一个子视图, 将该视图视为该触摸事件的响应者. 完成响应者链的查询过程.

顺序如下: UIApplication -> window -> ViewController -> view -> view 的子视图 -> ......

3.  判断该响应者是否具有处理该触摸事件的能力, 如果有, 那么处理该事件. 如果没有, 则把该视图的父视图作为该触摸事件的响应者, 再判断当前的响应者 (即上一个没有处理事件能力的响应者的父视图) 是否具有处理事件的能力. 如果有, 则处理, 如果没有, 继续按上一个步骤执行. 如果将响应者传递到UIApplication, 并且UIApplication也没有处理该触摸事件的能力, 那么将丢弃该触摸事件.


总结: 响应者链对事件响应者的查询和对事件的处理是两个相反的过程

查询的顺序是: 从UIApplication开始, 逐级向"下"查询, 一直查找到最上面的那个子视图.

处理事件的响应者的查找顺序: 从找到的最上边的子视图, 逐级向"上", 即查找有处理该事件能力的父视图, 
假设所有父视图(除了UIApplication), 都没有解决这个事件的能力, 则最后一层的传递则是到UIApplication.





***阻断响应者链 (userInteractionEnabled  =  NO )
 
阻断检测查询过程
父视图设置userInteractionEnabled = NO时, 其子视图的响应方法不能得到实现.


UILabel的userInteractionEnabled属性 :




例如: 在UILabel的对象上添加一个UIButton对象, 给UIButton设置一个点击触发事件 buttonAction, 

****(注意: 在UILabel对象上添加子视图, 如果该label的背景色不是透明色, 那么将不会显示其上的子视图,.此时虽然该子视图还是在该显示的位置上, 但是由于label的特性, 使得它的子视图不显示出来.  如果不设置label的背景颜色, 则能够显示出子视图.     


并且: UILabel的 userInteractionEnabled属性默认为 NO, 即阻断响应者链, 不允许其子视图发生响应事件. 如果想让UILabel对象的子视图具有响应时间的能力, 并且能够响应事件, 那么需要将UILabel对象的userInteractionEnabled属性设置为YES.  )

代码如下:

  UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 200, 100)];

    

    label.text = @"nbigbagn";

    

    //label.backgroundColor = [UIColor blueColor];

    //设置label的背景颜色会使其上的子视图不能显示.

    

    

    

    [self.window addSubview:label];

    

    [label release];

    

//设置userInteractionEnabled属性为yes, 是该子视图具备响应事件的能力, 即不阻断响应者链  

    label.userInteractionEnabled = YES;


  

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

    

    btn.frame = CGRectMake(0, 0, 50, 50);

    

    [btn setTitle:@"OK" forState:UIControlStateNormal];

    

    btn.backgroundColor = [UIColor blackColor];

    

    [btn addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];

    

    [label addSubview:btn];

    

    

    [self.window release];

    

    [self.window makeKeyAndVisible];

    return YES;

}



-(void)buttonAction:(UIButton *)sender

{

    NSLog(@"gfafas");

    sender.backgroundColor = [UIColor magentaColor];

}


UILabel的使用、事件响应及传值

你可以这样使用: UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 60, 30)]; label.background...
  • LVXIANGAN
  • LVXIANGAN
  • 2014年04月14日 09:46
  • 5478

【iOS开发-56】案例BUG:按钮的enabled、控件的userInteractionEnabled以及两种提示框UIAlert和UIActionSheet

以下语句的原理在于:如果我们正在回答的时最后一道题,那么答对之后,它会继续调用nextQuestion方法,这个时候我们就判断它是否是最后一道题,如果是,则弹框。...
  • wsb200514
  • wsb200514
  • 2014年10月18日 21:28
  • 1596

关于UIButton不改变title的问题(enable与userInteractionEnabled)

// 在发短信的界面中遇到一个问题,点击了发送短信,将发送短信的按钮设置为disable的状态,如下 sendMsgBtn.enabled = NO; //然后在倒计时中的方法为 seconds --...
  • hulala_wuqiang
  • hulala_wuqiang
  • 2016年09月26日 17:25
  • 510

UILabel 属性

关于unlabel属性的解析
  • baidu_33209995
  • baidu_33209995
  • 2016年04月07日 11:36
  • 141

ios uilabel显示图片和各种属性说明 uilabel很强大!!!!

代码如下 方法调用如下 NSString * Str = @"中国人民解放军万岁,中华人民共和国万岁,万岁!"; self.attrobiuteLabel.attributedText =...
  • qian521kun521
  • qian521kun521
  • 2017年02月16日 10:43
  • 1263

iOS事件传递:响应者链

事件传递:响应者链 当你设计你的app 时候,经常动态地响应事件对不对。比如,屏幕上的许多对象都会触发一个触摸的事件,你必须决定让谁来响应这个时间并且要明白这个对象怎么接收到事件。   当一个用...
  • dayuqi
  • dayuqi
  • 2015年10月30日 20:05
  • 2491

UIButton属性设置的优先级userInteractionEnabled,selected,enabled

UIButton属性设置的优先级userInteractionEnabled,selected,enabled
  • opentogether
  • opentogether
  • 2016年04月28日 10:40
  • 869

enabled、scrollEnabled和userInteractionEnabled的区别

enabled、scrollEnabled和userInteractionEnabled的区别! enabled 表示控件不可用 scrollEnabled 表示控件不可滚动 userInteract...
  • Jackson__Chan
  • Jackson__Chan
  • 2016年12月25日 05:02
  • 1193

UILabel的相关属性设置

[label sizeToFit];
  • u011385024
  • u011385024
  • 2013年09月10日 10:39
  • 12564

UIUILabel属性汇总

今天重新看了一下UILable这个属性,感觉还是蛮好的
  • qq_16437739
  • qq_16437739
  • 2015年12月28日 10:21
  • 473
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:响应者链和 UILabel的userInteractionEnabled属性
举报原因:
原因补充:

(最多只允许输入30个字)