今天這篇文章是觸摸事件的第二篇。
大綱
1.響應(yīng)者鏈條
2.觸摸事件的攔截
發(fā)生觸摸事件之后,系統(tǒng)會將該事件加入到一個由UIApplication管理的事件隊(duì)列中。UIApplication會從世界隊(duì)列中去除最前面的事件并將其分發(fā)處理欠啤,先發(fā)送事件給應(yīng)用程序的主窗口郊艘。
主窗口會調(diào)用hitTest:withEvent:方法在視圖繼承樹中找到一個最合適的子視圖來處理觸摸事件僚祷,該視圖即為:hitTest返回的視圖尺锚。
響應(yīng)者鏈條:是通過遞歸構(gòu)成的一組UIResponder對象的鏈?zhǔn)叫蛄小?br> 響應(yīng)者鏈條的處理過程:
- 如果hitTest 無法處理的視圖就向上傳遞。
- 如果UIWindow不能處理讶凉, 就傳遞給uiapplication染乌。
- 如果UIApplication不能處理該消息就將其丟棄。
不能處理接受用戶交換的三種情況
- User Interaction Enabled = NO
- hidden = YES
- alpha = 0~0.01
響應(yīng)者事件攔截的例子
三個view疊加在一起懂讯,底部的view響應(yīng)觸摸事件荷憋,主要是hitTest方法來重寫來攔截。
//重寫hitTest方法來攔截事件褐望。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
//1.判斷當(dāng)前視圖能否接受用戶響應(yīng)
/*
[self setUserInteractionEnabled:YES];
self.alpha > 0.01;
self.hidden ==NO
*/
//2.遍歷其中的所有子視圖 是否對用戶做出相應(yīng)
//3.把event 交給上級視圖或試圖控制器處理
//4.如果 return nil;說明當(dāng)前視圖或者視圖控制器均不做出響應(yīng)
//參數(shù)說明 :
//point參數(shù) 是 用戶觸摸位置相對當(dāng)前視圖坐標(biāo)系的點(diǎn)
NSLog(@"%@",NSStringFromCGPoint(point));
//需要轉(zhuǎn)換成紅色視圖坐標(biāo)系對應(yīng)的點(diǎn)
CGPoint redPoint = [self convertPoint:point toView:self.redView];
//轉(zhuǎn)花綠色視圖的點(diǎn)
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一起配合使用勒庄,判斷當(dāng)前轉(zhuǎn)換過的點(diǎn)是否在視圖的內(nèi)部,如果是就返回瘫里,把事件攔截实蔽。
**
使imageView響應(yīng)用戶點(diǎn)觸摸
[self.imageView setUserInteractionEnabled:YES];
簡單的判斷觸摸的點(diǎn)在那個視圖中 [touch view]
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.獲取用戶點(diǎn)擊 UITouch對象
UITouch *touch = [touches anyObject];
//2.判斷點(diǎn)擊到哪一個視圖
if ([touch view] == self.imageView) {
NSLog(@"點(diǎn)擊圖片");
}else if ([touch view] == self.redView){
NSLog(@"點(diǎn)擊紅色視圖");
}else if([touch view] == self.greenView){
NSLog(@"綠色視圖");
}
}
通過StoryBoard或者xib創(chuàng)建的視圖,initWithFrame方法不會被調(diào)用
坐標(biāo)轉(zhuǎn)換: