hitTest

熟記響應(yīng)者鏈沒大毛用,主要還是要從代碼層面去理解其過程。從圖記起:


MJ圖
點(diǎn)擊E為例

以點(diǎn)擊E為例Hittest步驟如下:
1.觸摸點(diǎn)在ViewA內(nèi),所以檢查SubViewB.C
2.觸摸點(diǎn)不在ViewB內(nèi),所以檢查ViewC的Subviews
3.觸摸點(diǎn)不在ViewD內(nèi),發(fā)生在ViewE內(nèi),所以hitTest最終返回ViewE;
PS: 子控件超出父視圖之外的部分點(diǎn)擊無效也正是基于此

//hitTest內(nèi)部通過pointInside:withEvent:方法來確定觸摸點(diǎn)是否在視圖內(nèi)
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {  

    //透明或隱藏或關(guān)閉交互,則返回nil
    if (self.alpha <= 0.01 || !self.userInteractionEnabled || self.hidden) {
        return nil;
    }
    BOOL inside = [self pointInside:point withEvent:event];
    //觸摸點(diǎn)在當(dāng)前視視圖
    if (inside) {
        //逆向遍歷子視圖
        NSEnumerator *enumerator = [self.subviews reverseObjectEnumerator];
        for (UIView *subview in enumerator) {
            UIView *hitView = [subview hitTest:point withEvent:event];
            if (hitView) {
                break;
            }
        }
        if (!hitView) {
            hitView = self;
        }
        return hitView;
    } else {
        return nil;
    }
}

最后附上一個(gè)穿透點(diǎn)擊事件

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    
  UIView *view =  [super hitTest:point withEvent:event];
    if ([view isEqual:self.btn1]) {
        return self.btn0;
    }
    return view;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容