hitText和pointInside
最近準備看點HTML5的東西,時間有點少,寫一點簡單的東西吧
介紹兩個方法
// 用于攔截點擊方法,使不能交互的視圖出現(xiàn)交互效果
// 事件傳遞的時候使用
// 當事件傳遞給控件的時候調(diào)用
// 尋找最合適的View進行處理,倒敘遍歷
// point:當前的觸摸點,point的這個坐標系就是方法的調(diào)用者
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
// 調(diào)用系統(tǒng)的做法去尋找最合適的view氧卧,返回最合適的view
UIView *fitView = [super hitTest:point withEvent:event];
return fitView;
}
// 作用:判斷當前這個點在不在方法調(diào)用者(控件)上
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
return YES;
}
這兩個方法一般配合使用
底層實現(xiàn)
// 點擊視圖 -》 事件 -》 UIApplication -> UIWindow
// 因為所有的視圖類都是繼承BaseView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
// 1.判斷當前控件能否接收事件
if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) return nil;
// 2. 判斷點在不在當前控件
if ([self pointInside:point withEvent:event] == NO) return nil;
// 3.從后往前遍歷自己的子控件
NSInteger count = self.subviews.count;
for (NSInteger i = count - 1; i >= 0; i--) {
UIView *childView = self.subviews[i];
// 把當前控件上的坐標系轉(zhuǎn)換成子控件上的坐標系
CGPoint childP = [self convertPoint:point toView:childView];
UIView *fitView = [childView hitTest:childP withEvent:event];
if (fitView) { // 尋找到最合適的view
return fitView;
}
}
// 循環(huán)結(jié)束,表示沒有比自己更合適的view
return self;
}
舉個簡單的應(yīng)用例子
需求:
一個視圖被一個蒙版擋住了,我們需要通過蒙版點擊這個視圖
-
(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
// 當前坐標系上的點轉(zhuǎn)換到按鈕上的點
CGPoint btnP = [self convertPoint:point toView:self.btn];// 判斷點在不在按鈕上
if ([self.btn pointInside:btnP withEvent:event]) {
// 點在按鈕上
return self.btn;
}else{
return [super hitTest:point withEvent:event];
}
}
哦了.這種情況很常見的,自己體會嘍