iOS基础-事件处理、响应者链

 1 //触摸四个方法
 2 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
 3     UITouch *touch = [touches anyObject];
 4     CGPoint point = [touch locationInView:self];
 5     NSLog(@"V开始触摸  %@",NSStringFromCGPoint(point) );
 6     
 7     
 8     
 9 }
10 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
11     
12     UITouch *touch = [touches anyObject];
13     CGPoint point = [touch locationInView:self];
14     NSLog(@"MVC 滑动  %@",NSStringFromCGPoint(point) );
15     float  a = point.x;
16     float b = point.y ;
17     float c = point.x;
18     self.backgroundColor = [UIColor colorWithRed:a/375.0 green:b/667.0 blue:c/375.0 alpha:1];
19     self.frame = CGRectMake(100, 100, a, b);
20     
21     
22 }
23 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
24     UITouch *touch = [touches anyObject];
25     CGPoint point = [touch locationInView:self];
26     NSLog(@"V停止触摸%@",NSStringFromCGPoint(point));
27 }
28 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
29     NSLog(@"V触摸取消");
30 }
 1 - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
 2     NSLog(@"开始摇动");
 3 }
 4 
 5 - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event{
 6     NSLog(@"取消摇动");
 7 }
 8 
 9 - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
10     NSLog(@"停止摇动");
11     
12     
13     a= a +1;
14     
15     for (int i = 0; i < 7; i++) {
16         UILabel *v = (UILabel *)[self.view viewWithTag:a];
17         v.text = [NSString stringWithFormat:@"%d",arc4random()  % 7];
18         v.font =[UIFont fontWithName:@"DBLCDTempBlack" size:65];
19         v.textAlignment = NSTextAlignmentCenter;
20         
21         if (a == 7) {
22             v.text = @"👩";
23             
24             
25         }
26     }
27     
28     
29     
30     
31     
32     
33 }

 

 

 

事件处理的事件传递

简介:

发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件 队列中,UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow)

UIView不接受触摸事件的三种情况:

不接收用户交互
userInteractionEnabled = NO

隐藏
hidden = YES

透明
alpha = 0.0 ~ 0.01

提示:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的

事件传递的详细过程:

主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,但是这仅仅是整个事件处理过程的第一步 找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理
touchesBegan…
touchesMoved…
touchedEnded… 这些touches方法的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理

 

 

 

示例:

事件传递示例

响应者链条

响应者链条示意图

事件传递的完整过程

先将事件对象由上往下传递(由父控件传递给子控件),找到最合适的控件来处理这个事件。 调用最合适控件的touches….方法 如果调用了[super touches….];就会将事件顺着响应者链条往上传递,传递给上一个响应者 接着就会调用上一个响应者的touches….方法

如何判断上一个响应者

如果当前这个view是控制器的view,那么控制器就是上一个响应者 如果当前这个view不是控制器的view,那么父控件就是上一个响应者

响应者链条的事件传递过程

如果view是控制器的view,就传递给控制器;如不是,则将其传递给它的父视图 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理 如果window对象也不处理,则其将事件或消息传递给UIApplication对象 如果UIApplication也不能处理该事件或消息,则将其丢弃
posted @ 2015-09-26 14:56  dingjianjaja  阅读(171)  评论(0编辑  收藏  举报