#pragma mark 在UIView視圖結構中查找點擊view的觸摸事件 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ // 若是不能夠交互 | 隱藏 | 透明度過小 3者任意一個都忽略不能點擊 if(!self.userInteractionEnabled || self.hidden || self.alpha<=0.01){ return nil; } if([self pointInside:point withEvent:event]){ __block UIView *hit = nil; //NSEnumerationReverse 倒序 [self.subviews enumerateObjectsWithOptions:(NSEnumerationReverse) usingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { ///進行座標轉化 CGPoint vonverPoint = [self convertPoint:point toView:obj]; hit = [obj hitTest:vonverPoint withEvent:event]; if(hit){ *stop = YES; } }]; if(hit){ return hit; }else{ return self; } }else{ return nil; } } #pragma mark 觸摸的位置是否在當前view視圖中合適的點擊位置 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{ CGFloat x1 = point.x; // 觸摸的x CGFloat y1 = point.y; // 觸摸的y CGFloat x2 = self.frame.size.width/2; //view的 x CGFloat y2 = self.frame.size.height/2; //view的 y double dis = sqrt((x1-x2 )*(x1-x2) + (y1-y2 )*(y1-y2)); //這裏設置本身的判斷,button的大小 或者按鈕中心的一點 或者buton裏放置的最大圓等 if(dis<=self.frame.size.width/2){ //判斷當前觸摸的點是否是本身要點擊的區域 return YES; }else{ return NO; } }
在UIView中作的轉盤遊戲,咱們須要判斷點擊的位置,而後作對應的點擊事件處理,咱們就能夠用上面的辦法,或者tabBar凸出的部分等都會用到,首先就要了解hitTest是什麼,而後他的調用順序才能合理的應用,來極大的縮短期。ide