無法點擊的視圖怎么加點擊事件

hitText和pointInside

最近準備看點HTML5的東西,時間有點少,寫一點簡單的東西吧

介紹兩個方法

// 用于攔截點擊方法,使不能交互的視圖出現交互效果
// 事件傳遞的時候使用
// 當事件傳遞給控件的時候調用
// 尋找最合適的View進行處理,倒敘遍歷
// point:當前的觸摸點,point的這個坐標系就是方法的調用者
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    // 調用系統的做法去尋找最合適的view,返回最合適的view
    UIView *fitView = [super hitTest:point withEvent:event];  
    return fitView;
}
// 作用:判斷當前這個點在不在方法調用者(控件)上
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    return YES;
}

這兩個方法一般配合使用

底層實現

// 點擊視圖 -》 事件 -》 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];
        
        // 把當前控件上的坐標系轉換成子控件上的坐標系
        CGPoint childP = [self convertPoint:point toView:childView];
        
        UIView *fitView = [childView hitTest:childP withEvent:event];
        
        
        if (fitView) { // 尋找到最合適的view
            return fitView;
        }
    }
    // 循環結束,表示沒有比自己更合適的view
    return self;
}

舉個簡單的應用例子
需求:
一個視圖被一個蒙版擋住了,我們需要通過蒙版點擊這個視圖

  • (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
    // 當前坐標系上的點轉換到按鈕上的點
    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];
    }
    }
    哦了.這種情況很常見的,自己體會嘍

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容