觸控事件02

weixin_34365417發表於2015-04-13

今天這篇文章是觸控事件的第二篇。

大綱

1.響應者鏈條
2.觸控事件的攔截

發生觸控事件之後,系統會將該事件加入到一個由UIApplication管理的事件佇列中。UIApplication會從世界佇列中去除最前面的事件並將其分發處理,先傳送事件給應用程式的主視窗。

主視窗會呼叫hitTest:withEvent:方法在檢視繼承樹中找到一個最合適的子檢視來處理觸控事件,該檢視即為:hitTest返回的檢視。

響應者鏈條:是通過遞迴構成的一組UIResponder物件的鏈式序列。
響應者鏈條的處理過程:

  1. 如果hitTest 無法處理的檢視就向上傳遞。
  2. 如果UIWindow不能處理, 就傳遞給uiapplication。
  3. 如果UIApplication不能處理該訊息就將其丟棄。

不能處理接受使用者交換的三種情況

  • User Interaction Enabled = NO
  • hidden = YES
  • alpha = 0~0.01

響應者事件攔截的例子

三個view疊加在一起,底部的view響應觸控事件,主要是hitTest方法來重寫來攔截。

//重寫hitTest方法來攔截事件。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    //1.判斷當前檢視能否接受使用者響應
    /*
     [self setUserInteractionEnabled:YES];
     self.alpha > 0.01;
     self.hidden ==NO
     */
    //2.遍歷其中的所有子檢視   是否對使用者做出相應
    //3.把event 交給上級檢視或試圖控制器處理
    //4.如果 return nil;說明當前檢視或者檢視控制器均不做出響應
    
    //引數說明 :
        //point引數 是 使用者觸控位置相對當前檢視座標系的點
    
    NSLog(@"%@",NSStringFromCGPoint(point));
    //需要轉換成紅色檢視座標系對應的點
    CGPoint redPoint = [self convertPoint:point toView:self.redView];
    //轉花綠色檢視的點
    CGPoint greenPoint = [self convertPoint:point toView:self.greenView];
    //此方法 雨hitTest一起使用
    if ([self.greenView pointInside:greenPoint withEvent:event]) {
        return self.greenView;
    }
    if ([self.redView pointInside:redPoint withEvent:event]) {
        return self.redView;
    }
    NSLog(@"紅色:%@",NSStringFromCGPoint(redPoint));
    return [super hitTest:point withEvent:event];
    
}

**分析:hitTest與pointInside一起配合使用,判斷當前轉換過的點是否在檢視的內部,如果是就返回,把事件攔截。
**
使imageView響應使用者點觸控
[self.imageView setUserInteractionEnabled:YES];

簡單的判斷觸控的點在那個檢視中 [touch view]

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //1.獲取使用者點選 UITouch物件
    UITouch *touch = [touches anyObject];
    //2.判斷點選到哪一個檢視
    if ([touch view] == self.imageView) {
        NSLog(@"點選圖片");
    }else if ([touch view] == self.redView){
        NSLog(@"點選紅色檢視");
    }else if([touch view] == self.greenView){
        NSLog(@"綠色檢視");
    }
}

通過StoryBoard或者xib建立的檢視,initWithFrame方法不會被呼叫
座標轉換:

相關文章