UITableView/UIScrollView 不能響應TouchBegin 的處理 及窺見 hitTest:withEvent:


重寫touchBegin 方法是不行的,在UITableView/UIScrollView

解決方案 重寫hitTest:withEvent:  在他們的子類中

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    
    static UIEvent *e = nil;
    
    if (e != nil && e == event) {
        e = nil;
        return [super hitTest:point withEvent:event];
    }
    
    e = event;
    
    if (event.type == UIEventTypeTouches) {
        NSSet *touches = [event touchesForView:self];
        UITouch *touch = [touches anyObject];
        if (touch.phase == UITouchPhaseBegan) {
            NSLog(@"Touches began");
        }else if(touch.phase == UITouchPhaseEnded){
            NSLog(@"Touches Ended");

        }else if(touch.phase == UITouchPhaseCancelled){
            NSLog(@"Touches Cancelled");

        }else if (touch.phase == UITouchPhaseMoved){
            NSLog(@"Touches Moved");

        }
    }
    return [super hitTest:point withEvent:event];
}

關於hitTest:withEvent: 

字面意思是撞擊測試,當手指觸摸到當前屏幕上活躍的 app 界面。ios 系統會將 當前觸摸操作 打包,具體就是UIEvent 

屏幕上的每一次動作都是一個UITouch,多個UITouch  組成一次UIEvent.  UIEvent 表示一次事件。

傳遞給當前活躍的App keyWindow.正常情況下 hitTest 確定屏幕上眾多View  中哪一發生了事件。

假如 當前屏幕布局如下。

假設一個單擊事件發生在了View D里面,系統首先會從最頂層的View A開始尋找,發現事件是在View A或者其子類里面,那么接着從B和C找,發現事件是在C或者其子類里面,那么接着到C里面找,這時發現事件是在D里面,並且D已經沒有子類了,那么hit-test view就是View D啦。

如果

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event  返回值 不為nil 則一值 查找view 的子view 重復調用hisTest 確定事件。

 

 

更多手勢傳遞文章:http://ryantang.me/blog/2013/12/07/ios-event-dispatch-1/

http://blog.csdn.net/wzzvictory/article/details/9264335

參見:http://www.cnblogs.com/klaus/archive/2013/04/22/3036692.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM