觸控事件02
今天這篇文章是觸控事件的第二篇。
大綱
1.響應者鏈條
2.觸控事件的攔截
發生觸控事件之後,系統會將該事件加入到一個由UIApplication管理的事件佇列中。UIApplication會從世界佇列中去除最前面的事件並將其分發處理,先傳送事件給應用程式的主視窗。
主視窗會呼叫hitTest:withEvent:方法在檢視繼承樹中找到一個最合適的子檢視來處理觸控事件,該檢視即為:hitTest返回的檢視。
響應者鏈條:是通過遞迴構成的一組UIResponder物件的鏈式序列。
響應者鏈條的處理過程:
- 如果hitTest 無法處理的檢視就向上傳遞。
- 如果UIWindow不能處理, 就傳遞給uiapplication。
- 如果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方法不會被呼叫
座標轉換:
相關文章
- 觸控事件事件
- JS觸控事件JS事件
- ScrollView 觸控事件View事件
- Unity觸控式螢幕觸控事件定義Unity事件
- Flutter:如何響應觸控事件Flutter事件
- 觸控事件獲取座標事件
- Android觸控事件(上)——事件的由來Android事件
- Android觸控事件(下)——事件的分發Android事件
- Android觸控事件的應用Android事件
- 微信小程式之觸控事件(六)微信小程式事件
- 安卓觸控事件與單擊事件的區別安卓事件
- Android觸控事件(續)——點選長按事件Android事件
- Android觸控事件傳遞機制Android事件
- 【透鏡系列】看穿 > 觸控事件分發 >事件
- iOS學習筆記05 觸控事件iOS筆記事件
- Android中TouchEvent觸控事件機制Android事件
- Android 觸控事件處理機制Android事件
- 通過程式碼控制View的觸控事件被觸發View事件
- iOS開發系列--觸控事件、手勢識別、搖晃事件、耳機線控iOS事件
- [翻譯]整合滑鼠、觸控 和觸控筆事件的Html5 Pointer Event Api事件HTMLAPI
- android 管理ViewGroup中的觸控事件AndroidView事件
- H5觸控事件判斷滑動方向H5事件
- 觸控事件分發核心機制優化吸收事件優化
- HTML5觸控事件(touchstart、touchmove和touchend) (轉)HTML事件
- Android中觸控事件的傳遞機制Android事件
- 初識Android觸控事件傳遞機制Android事件
- 微信小遊戲開發(4)-動畫和觸控事件遊戲開發動畫事件
- android 觸控(Touch)事件、點選(Click)事件的區別(詳細解析)Android事件
- 【Android Developers Training】 67. 響應觸控事件AndroidDeveloperAI事件
- 大領導給小明安排任務——Android觸控事件Android事件
- 十分鐘瞭解Android觸控事件原理(InputManagerService)Android事件
- [SceneKit專題]5-3D空間的觸控事件3D事件
- iOS中觸控事件的傳遞和響應機制iOS事件
- WPF 已知問題 監聽 WMI 事件導致觸控失效事件
- wpf 觸控 觸控後無法開啟pupup
- 低功耗抗干擾2路觸控檢測晶片,2通道2鍵觸控觸控IC-VK3702DM晶片
- 大領導又給小明安排任務——Android觸控事件Android事件
- android觸控事件分發機制,曾困惑你我的地方Android事件