クリックできないビューはどのようにイベントをクリックしますか?

1829 ワード

hitTextとpointInside
最近はHTML 5を見るものを用意していますが、時間が少し少ないので、簡単なものを書きましょう
二つの方法を紹介する
//         ,              
//          
//              
//       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;
}


この2つの方法は一般的に組み合わせて使用される.
最下位実装
//      -》    -》 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;
}

簡単な応用例の需要を挙げます:1つのビューは1つのマスクに遮られて、私達はマスクを通じてこのビューをクリックする必要があります
  • (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]; } } ああこのような情況はとてもよくあるので、自分で体得します